Java - 对象如何从年轻代到老年代
2018-01-26 16:24
417 查看
几种 GC 方式
Minor GC:年轻代,频率高,速度快Major GC:老年代
Full GC:整个堆(年轻代,老年代)
对象的生命历程
一般新生对象要进入Eden 区,Eden 区被填满时,要进行GC,GC之后还存活的对象将被复制到两个Survivor 区域中的一个。假定该Survivor 为From 区,From 区被填满之后,这个区域也要进行GC,GC 之后存活的的对象将会复制到To 区,From区清空。To区也被填满时,之前从From 区复制过来的那部分对象仍在活动则进入老年代。(From,To 必有一区会是空的)对象年龄与转移时机
通过年龄计数器判断一个对象是否需要转移。对象每经过一个GC 仍然活着,年龄计数器加1。当年龄超过设定的值,则将其通过担保机制转移到老年代。也可以动态判定,当Survivor 中 年龄相同的对象超半数,则年龄大于该年龄的对象转移到老年代,无需等待到达设置的最大年龄值。
大对象直接进入老年代。
GC 安全检查
在Minor GC 之前,检查老年代的可用空间是否大于年轻代的对象总和,若大于则是一次安全的Minor GC,不大于[ 允许担保失败],则比较历次晋升到老年代的对象的平均大小是否大于老年代的最大可用空间,若大于则进行一次冒险的Minor GC。有可能老年代不满足空间需求(不大于,并且不允许担保失败),则进行一次Full GC。
Minor GC 存在的原因是,年轻代只使用要给Survivor 保存仍存活的对象。
在一次安全Minor GC 中,仍然存活的对象不能在另一个Survivor 完全容纳,则会通过担保机制进入老年代。
老年代的对象
大对象(字符串与数组),即超过了设定值的对象长期存活的对象
相关文章推荐
- Java中如何将XML对象反序列化
- 如何用JAVA实现在ACCESS表中插入对象?
- java如何获取对象在内存中的大小
- 如何计算java对象占用的内存
- Java中对象如何初始化(实例化)
- java 如何对自定义的对象进行排序
- 创建智能网络蜘蛛——如何使用Java网络对象和HTML对象(翻译)
- 如何获取Java中内存对象的大小? sizeof = ?
- JSF(Java Server Face) 框架中如何获取传统的HttpSession或HttpServletRequest对象
- 如何把java.util.Date对象保存到SQLServer中类型为datetime类型字段中
- java多态,如何理解父类引用指向子类对象
- 如何利用java的反射机制动态的取得对象的属性?
- Java中如何给一个对象排序
- Flex 如何使用JAVA对象连接SQLServer数据库(转载)
- 如何在java的被调用函数中创建对象,并通过参数传回?
- [Java] 如何将String转成Data对象
- [摘选]Java中如何操作和保存对象?
- Java: 如何访问一个对象
- 关于 Ajax 的 Java 对象序列化 及获得数据后如何展现出来
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?