JVM总结
一,JVM内存区域
方法区(method area):
该区域属于线程共享的内存区域,又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常;
JVM堆(java heap)
该区域属于线程共享的内存区域,它在虚拟机启动时创建,是java虚拟机所管理的内存中最大的一块,主要用于存放对象实例,几乎所有的对象实例都在这里分配内存,注意java堆是垃圾收集器管理的主要区域,因此很多时候也被称作GC堆,如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常.
程序计数器(program counter register)
该区域属于线程私有的数据区域,是一小块内存空间,主要代表当前线程所执行的字节码行号指示器.字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成;
虚拟机栈(java virtual machine stacks)
该区域属于私有的数据区域,与线程同时创建,总数与线程关联,代表java 方法执行的内存模型.每个方法执行时都会创建一个栈桢来存储方法的变量表,操作数栈,动态链接方法,返回值,返回地址等信息;
本地方法栈(native method stacks)
该区域属于线程私有的数据区域,这部分主要与虚拟机用到的native方法相关,一般情况下,我们无需关心此区域;
二,GC算法
- 复制算法:两个区域A和B,初始对象在A,继续存活的对象呗转移到B,此为新生代最常用的算法;
- 标记清除法:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象;不良后果,效率不高且容易产生内存碎片.
- 标记整理算法:前期是标记清除法,但是后续步骤不是直接对可回收对象进行清理,而是让存活的对象都向一端移动,然后直接清理掉端边界以外的内存;老年代采用该算法;