一、JVM内存模型和GC
虚拟机在运行程序时,会把它管理的内存划分为不同的数据区域。
其中,线程独占的数据区:程序计数器、栈(包括本地方法栈和虚拟机栈),这些区域随线程的消亡释放。
堆、方法区是共享的区域,这部分内存的分配都是动态的,通常所说的GC一般指这块区域。
JVM的GC机制其实就是判断哪些内存需要回收、如何回收、什么时候回收的过程。
1、Java中通过可达性分析来判断对象是否存活。做可达性分析的过程就是同过选定的一系列GC roots的对象开始向下搜索,当一个对象没有在任何引用链上出现就会被判定为可回收的。(其实不是判定就一定回收)
GC Roots对象是“永久”对象,如栈中引用对象、方法区中静态属性、常量引用的对象等。
2、GC回收算法主要有标记清除算法、复制算法、标记整理算法等。
像最简单的标记清除算法,就是分析标记完后,统一回收所有标记的对象;复制算法,是将可用内存分为两块,每次用其中一块,将活着的对象复制到新区域,将用过的一并清除。
一般用来回收年新生代内存。实际使用中JVM将内存分成一块较大的Eden空间和两块Survivor空间,每次使用Eden和一块Survivor,另一块Survivor留做存活对象复制。
标记整理算法,一般用来回收年老代内存,因为年老代没有额外内存担保。做法是先标记,然后让存活的对象移动到一端,清理边界以外的内存。
3、对于GC的时机,大多数情况下对象优先分配在Eden区中,当Eden没有足够的空间时,JVM会发起一次Minor GC
在进行Minor GC之前,JVM会检查老年代最大可用的空间是否大于新生代所有对象的空间,成立则MinorGC是安全的,否则判断是否允许担保失败,是尝试MinorGC,否则FullGC。
Copyright © 2015 - 2016 DISPACE.NET | 使用帮助 | 关于我们 | 投诉建议