长沙java培训
达内长沙芙蓉路中心

18487146383

热门课程

达内长沙Java培训详解垃圾回收机制

  • 时间:2017-01-21
  • 发布:长沙Java培训
  • 来源:简书

垃圾回收的基本规则:分代收集,每代的回收机制都不同。

年轻代

当Eden区满的时候,执行Minor GC,将存活对象复制到Survivor0中,清空Eden区;

下次Eden区满了,再执行Minor GC,将存活对象复制到Survivor1中,清空Eden区;

将Survivor0中可以晋级的对象挪到年老代,存活的对象复制到Survivor1中,清空Survivor0区;

对象在两个Survivor区中复制多次后,(Hot Spot默认15次),对象会复制到年老代。

从上面的过程看出,Eden区是一个连续的空间,且Survivor区总有一个为空。经过一次GC和复制,一个Survivor区保存当前存活的对象,而Eden区和另一个Survivor区的内容都不在需要,直接清空。到下一次GC时,两个Survivor区的角色互换。这种方式分配内存和清理内存效率极高,这种垃圾回收的方式就是 停止-复制(stop-and-copy)清理法。

由于绝大部分的对象都是短命的,甚至存活不到Survivor中,所以,Eden区与Survivor的比例较大,HotSpot默认是8:1,即分别占新生代的80%,10%,10%。如果一次回收中,Survivor+Eden中存活下来的内存超过了10%,则需要将一部分对象分配到年老代。

年老代

年老代存储的对象比年轻代多很多,而且不乏大对象,对年老代实施停止-复制算法,则相当低效。一般,年老代使用的算法是“标记-整理”算法,即:标记仍然存活的对象,将所有存活的对象向一端移动,以保证内存的连续。

在发生Minor GC时,虚拟机会检查每次晋升进入年老代的对象大小是否大于年老代的剩余空间。如果年老代的剩余空间不够,则直接出发一次Full GC。否则,就需要看是否设置XX:+HandlePromotionFailure,如果不允许升级失败,则每次Minor GC都会触发Full GC,哪怕年老代还有足够的内存空间。

方法区(永久代)

永久代的回收有两种:常量池中的常量和无用的类信息。其中对于无用的类进行回收,必须保证3点:

类的所有实例都已经被回收

加载类的ClassLoader已经被回收

类对象的Class对象没有被引用(即没有通过反射引用该类)

长沙Java培训选长沙达内,详情请登陆长沙达内Java培训官网(cs.Java.tedu.cn)!

上一篇:达内长沙Java培训详解内存分配
下一篇:达内长沙Java培训详解垃圾收集器

达内长沙Java培训教你阅读GC日志

spring注入配置文件属性到java类

Java中Vector和ArrayList的区别

达内长沙Java培训详解volatile关键字

选择城市和中心
贵州省

广西省

海南省

台湾