本文主要是介绍Java的堆如何分代的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
java对象一般都是朝生夕死,也有部分对象是一直存在的。两种对象如何都放在一起,进行垃圾回收的时候效率较低。所以通过将不同时期的对象放在不同的内存池中,节省垃圾回收的时间,提高性能。
组成:
新生代和老年代,新生代存放新创建的对象,老年代存放长期存在的对象。
新生代的组成:
1、年轻区(Eden)
2、Survivor区(From Survivor 、 To Survivor)
两者之间的空间大小默认的比例是8:2,可通过-XX:SurvivorRatio调整
两者之间的关系:
1、很多对象都是创建在Eden区,Eden区内存用完的时候,会触发GC,非活对象会被标记死亡,活着的对象移动到Survivor区
2、Survivor内存也使用完的话,对象会被移动到老年代
老年代:
老年代的对象存活很久,GC回收会很慢
对象的分代晋升:
正常情况下,对象在新生代进行分配,当Eden区内存耗尽,无法分配新的对象时候,会触发YoungGC进行垃圾回收,没有被回收的对象搬运到Survivor区,这个过程叫做晋升。
对象也会晋升到老年代,触发的条件主要是:年龄和对象的大小
1、躲过15次GC,每次垃圾回收的时候,没有被回收掉的对象年龄就会+1,累计到15次(jdk1.8默认),就会进入到老年代。
2、动态的年龄判断:
如果Survivor空间中小于等于某个年龄的所有对象的大小总和大于Survivor空间的一半时,就把大于等于这个年龄的对象都晋升到老年代
3、大对象直接进入到老年代;-XX:PretenureSizeThreshold 设置大对象的临界值 默认为0
永久代:
1.8之后,被重构为元空间(MetaSpace)
这篇关于Java的堆如何分代的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!