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)

相关推荐
我是一颗柠檬4 分钟前
【Java项目技术亮点】滑动窗口限流算法
java·开发语言·算法
我登哥MVP8 分钟前
SpringCloud Alibaba 核心组件解析:分布式事务(Seata)
java·spring boot·分布式·spring·spring cloud·java-ee·intellij-idea
于指尖飞舞11 分钟前
java后端面试题(jvm极简)
java·开发语言·jvm
Seven9712 分钟前
面试官:你们项目里的线程池是怎么用的?怎么管理的?
java
xieliyu.15 分钟前
Java数据结构:从0开始手搓Hash桶
java·数据结构·哈希算法
影视飓风TIM21 分钟前
C++ 核心语法笔记:拷贝构造、深浅拷贝与运算符重载
java·开发语言·javascript
鹅城剑仙23 分钟前
JVM 内存模型与 GC 调优实战指南
jvm
极创信息25 分钟前
信创产品适配测试认证,域名和SSL是必须的吗?
java·开发语言·网络·python·网络协议·ruby·ssl
Y学院35 分钟前
Java 智能体开发实战:从核心架构到生产级落地,告别AI调用积木式编程
java·人工智能·架构
Javatutouhouduan44 分钟前
2026年Java面试核心讲(终极版)全网首次开源!
java·jvm·java多线程·java面试·后端开发·java程序员·java八股文