一直从事JAVA开发,每天和JVM打交道,仔细想一想对JVM还真的不是特别了解,实在是不该该.周六看了许多资料,也算有点心得,记录一下。测试
JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计数器.对象
方法区:属于共享区域,存放已经被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码.须要额外注意的是平时常说的常量池就是在这个区域,全称为运行时常量池,存放编译好的字面量和符号引用,有时候会利用String的intern()在运行时,加载进去.对于方法区来讲,若是申请不到内存,就会抛出内存溢出(OutOfMemoryError)错误.内存
堆:属于共享区域,最常常打交道的区域,也是GC主要管理区域,主要存储对象实例,同理,也会抛出内存溢出(OutOfMemoryError)错误.开发
虚拟机栈:属于私有区域,常说的栈,存储局部变量表、操做数栈、动态连接方法、返回值、返回地址等信息.内部结构是栈里全是栈帧,会出现两种错误,第一种StackOverFlowError,是由于栈长度到顶,再放入内容,致使栈溢出,通常产生此状况是由于局部变量多,字节大致使,因此能够增长栈的深度,经过-Xss来进行设置每一个栈的大小,默认为1M.还有一种错误是内存溢出(OutOfMemoryError),申请的内存空间超过最大.编译器
本地方法栈:相似虚拟机栈,只不过与虚拟机用到的Native方法相关.虚拟机
程序计数器:属于私有区域,存储字节码指令,如代码中循环、跳转、异常处理等都依赖程序计数器.编译
有一个疑惑,看到有这么一个问题,基本类型变量究竟存储在哪里?网上有两种答案,第一种认为都是存储在虚拟机栈中.第二种认为局部基本类型变量存储在虚拟机栈中,可是对于全局基本类型变量存储在堆中,引用类型变量存储在虚拟机栈中.目前尚未确切答案,待测试过以后,再补充答案.变量