JVM中的GC流程与对象晋升机制
💖The Begin💖点点关注,收藏不迷路💖
|
在Java虚拟机(JVM)中,垃圾回收(GC)是自动管理内存的关键机制。
1、JVM堆内存结构
Java堆是JVM中用于存放对象实例的内存区域,它被划分为新生代(Young Generation)和老年代(Old Generation)。新生代又进一步细分为Eden区、两个Survivor区(S0和S1,也称为From和To区,它们通过复制算法交换角色)。
2、Minor GC流程
当Eden区的空间被新创建的对象填满时,JVM会触发Minor GC(也称为Young GC)。Minor GC的目标是清理新生代中的垃圾对象,回收其占用的内存空间。
- 收集与清理:JVM会扫描Eden区和当前的Survivor区(如S0),标记出存活的对象。
- 复制与交换:存活的对象会被复制到另一个空的Survivor区(如S1),同时清空Eden区和原来的Survivor区(S0)。这时,S0和S1的角色会互换。
- 对象晋升:在Minor GC过程中,如果对象满足以下条件之一,它们会被直接晋升到老年代:
- 大对象:需要大量连续内存空间的对象,这些对象在创建时如果Eden区剩余空间不足,会直接分配到老年代。
- 长期存活:对象在Eden区出生,并经过多次Minor GC后仍然存活,并且被Survivor区容纳。每次Minor GC后,对象的年龄(即经过的Minor GC次数)会增加。当年龄达到JVM设定的阈值(默认为15)时,对象会被晋升到老年代。
3、Full GC流程
当老年代空间不足时,JVM会触发Full GC(也称为Major GC或Old GC)。Full GC会清理整个堆内存,包括新生代和老年代。
- 停止-复制/标记-清除/标记-整理:根据JVM使用的垃圾回收器类型(如Serial GC、Parallel GC、CMS、G1等),Full GC会采用不同的算法来清理垃圾对象。这些算法包括停止-复制、标记-清除和标记-整理等。
- 性能影响:Full GC通常比Minor GC慢得多,因为它需要处理整个堆内存。在Full GC期间,应用程序的线程会暂停(Stop-The-World),直到GC完成。
4、总结
通过合理设置JVM参数、优化代码逻辑和内存使用,可以减少GC的频率和持续时间,提高应用的响应速度和吞吐量。
💖The End💖点点关注,收藏不迷路💖
|