当前虚拟机的垃圾回收算法基本都采用“分代收集算法”,这种算法并没有什么新的思想,主要是基于对象的存活周期进行了分类。
对象存活周期分类:
新生代:朝生夕死的对象(死亡率达到90%以上,例如:方法的局部变量等; (细分为:eden,Survivor from,Survivor To)
老年代:存活得比较久,但还是要死的对象(例如:缓存对象、单例对象等)。
永久代:对象生成后几乎不灭的对象(例如:加载过的类信息)。
内存区域:
新生代和老年代位于java堆内存中,永久代位于方法区;
垃圾回收:
在新生代中每次回收都有大批死亡的对象需要回收,采用复制算法,由于存活对象数量少,降低了复制的成本,由于新生代对象存活率低,所以一般不需要新生代50%作为空闲区域,而是eden区为80%,作为给新生对象分配内存,from区10%,to区10%,每次发生GC时,只需要把eden和其中一块Survivor中存活的对象复制到另一块Survivor中,释放回收后的90%内存;
老年代:由于老年代中的对象存活率较高,并且没有额外的空间进行分配担保,即采用“标记-清理”或者“标记-清除”算法进行低频长时间的GC;
方法区对象回收:永久代指的是虚拟机内存中的方法区,永久代垃圾回收比较少,效率也比较低,但也必须进行垃圾回收,否则永久代内存不够用时仍然会抛出OutOfMemoryError异常。永久代也使用“标记-清除”或者“标记-整理”算法进行垃圾回收。
JVM垃圾回收算法——分代收集算法
最新推荐文章于 2024-03-06 08:50:22 发布