一个毕业后未进大厂的程序员的进阶之路——既为巩固知识,也为交流学习。收藏+关注方便观看后续更新。
痴迷技术,热爱分享。个人微信公众号**【一条IT】,免费领取java/python全套学习资料。**
前言
==
本文主要介绍堆内存的结构及对象在堆中的生命周期和垃圾回收。
目录
前言
一、堆的结构
1.1新生区
1.2 养老区
1.3堆结构的代码验证
二、对象的生命周期和垃圾回收
1.对象被回收的流程
2.永久代/元空间
总结
===================================================================
- 新生区:新生区分为三部分,一块较大的Eden(伊甸)空间和两块较小的Survivor(幸存者)空间,默认比例为8:1:1。
- 养老区
- 永久存储区/元空间:JDK1.8之后元空间替代永久区
新生区和养老区是垃圾回收的主要区域。新生区和养老区的面积比是1:2
逻辑结构
物理结构
1.1新生区
新生成的对象全部优先存放在新生区中,新生区对象朝生夕死,存活率很低,在新生代中,常规应用进行一次垃圾收集一般可以回收70% ~ 95% 的空间,回收效率很高。
1.2 养老区
在新生代中经历了多次(具体看虚拟机配置的阀值)GC后仍然存活下来的对象会进入老年代中。养老区的空间满了之后会进行Full GC,也叫重GC,FGC。老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢。当FGC之后,养老区依然没有足够的空间,堆内存溢出。OOM:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
1.3堆结构的代码验证
首先 idea 进入 Edit configuration -> VM options:
添加:-XX:+PrintGCDetails
/**
* @Author: 一条IT
* @Date: 2020/12/6 12:47
*/
public class TestJVM {
public static void main(String[] args) {
// jvm分配的最大内存 默认物理内存的1/4
System.out.println("-Xmx:"+Runtime.getRuntime().maxMemory()/1024/1024+"Mb");
// jvm分配的初始内存 默认物理内存的1/64
System.out.println("-Mms:"+Runtime.getRuntime().totalMemory()/1024/1024+"Mb");
}
}
输出结果