java虚拟机内存管理图如下图所示:
1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成:
1.方法区:
1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据。
2.垃圾回收器也会光顾这个区域,例如常量池。
3.HotSpot中用方法区来实现永久代。这样的做的好处就是,垃圾回收器可以像管理java堆一样管理这部分内存,省去了为方法区编写内存管理的工作,注意的是这
仅仅限于HotSpot中,其他的虚拟机并没有永久代这个概念,虚拟机规范中,永久代不等于方法区,而且没有进行详细的规范说明。用方法区实现永久代并不是一个很好的途径
HotSpot在JDK1.7中进行的改进。
2.java堆:
1.存储对象实例,可以人作为所有对象的实例存储在这里,涉及编译优化和虚拟机优化的时候有些对象实例并不存储在这里。
2.垃圾收集器管理的主要区域。
3.长时间存活的对象实例会被放入老年代去,不长期存活的会在新生代中。
4.当对空间申请完后会抛出OutOfMemory的内存溢出异常。
2.线程独占区,是每一个线程都有自己独立的虚拟机栈,本地方法栈,程序计数器。
1.虚拟机栈:存储方法运行时所需的数据,成为栈帧。
1.虚拟机栈描述的是java方法执行的动态内存模型。
2.栈帧:每个方法的执行都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态连接,方法出口等。
3.局部变量表:
1.存放编译期可知的各种变量类型,引用类型,returnAddress类型。
2.局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,方法运行期间不会改变局部变量表的大小。
4.大小:虚拟机栈的空间是有限的。举个例子。如下面代码: