博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java堆是如何划分的?
阅读量:785 次
发布时间:2019-03-25

本文共 702 字,大约阅读时间需要 2 分钟。

写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见

解答

Java 虚拟机将堆划分为新生代和老年代。其中,新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区(From Survivor 和 To Survivor)。之所以这样划分,是为了更好的进行垃圾回收,新生代中 Java 对象都是朝生暮死的,非常适合复制算法。新建 Java 对象优先放到 Eden 区,当 Eden 区的空间耗尽时, Java 虚拟机便会触发一次 Minor GC,来收集新生代的垃圾。Eden 区和 from 指向的 Survivor 区中的存活对象会被复制到 to 指向的 Survivor 区中,然后交换 from 和 to 指针,以保证下一次 Minor GC 时,to 指向的 Survivor 区还是空的。注意JDK8开始商用的 G1 垃圾回收器进行垃圾回收时不再区分新生代和老年代,G1 开创性的基于 Region 进行堆内存划分。

Java堆划分

补充

默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor 区的使用情况动态调整 Eden 区和

Survivor 区的比例。

当然,你也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高。

转载地址:http://hcsuk.baihongyu.com/

你可能感兴趣的文章