什么是 Java 垃圾收集 ?标记和清除、Young、Old、Perm 概念总结
- 在进行Java编程时,您经常会听到垃圾收集这个术语。尽管在开发的早期阶段没有这些知识也可以进行开发,但最好了解一下以优化性能或防止内存泄漏。
- 这是在使用 Java 的公司面试中经常被问到的话题之一。
- 在本文档中,我们将总结Java垃圾收集,以便您轻松理解。
- 这是一个简短的总结,旨在帮助您理解未知概念,因此我们建议您阅读其他文章以获取详细信息。
什么是垃圾收集?
- Garbage Collection 这个名称的意思是垃圾的收集。 自动收集未使用的内存
- 未使用的内存:不再使用的内存。
- 内存收集:释放未使用的内存,以便可以再次使用。
- Java内存管理是通过JVM完成的。
- 在现有语言中,程序员必须直接处理内存分配和释放。如果内存没有被正确释放,未使用的内存会不断累积,从而发生内存泄漏。
- JVM是一个虚拟机,自动处理内存分配和释放,无需用户担心
- 通过在运行程序时给出JVM选项来指定JVM要使用的内存大小。
- 通过不直接访问操作系统级别的内存,可以防止操作系统级别的内存泄漏。
- 垃圾收集通过从堆区域中删除无法访问的对象来保护内存
什么是标记和清除?
- 特征
- 垃圾收集是使用标记和清除方法完成的
- 垃圾回收后的内存状态是保证内存空间的状态。
- 查找并标记可到达的对象。垃圾收集器扫描堆栈中的所有变量以查找每个变量引用的对象。
- 所有线程都停止进行标记工作,这称为停止世界
- 由于上述原因,您可以通过调用System.gc()显式地引发垃圾回收,但不建议这样做。
扫一扫
堆区 - Young(Eden、Survivor)、Old、Perm
- 堆区由 Young Generation、Old Generation 和 Perm 区组成
- 总共由5个区域组成
- 年轻一代:伊甸园,幸存者 0,幸存者 1
- 老一代
- 彼尔姆地区

年轻一 代
- 由Eden区、Survivor 0、Survivor 1区组成
- 伊甸园
- 新创建的对象所在的位置
- 当Eden区满时发生Minor GC
- 幸存者区
- 伊甸园中幸存物体所在的位置
- 有两个区域,S0 和 S1,其中一个是空的,另一个包含幸存的对象。
- 将幸存的对象从Eden区和非空Survivor区移动到空Survivor区。
- 当从一个幸存者区域移动到另一个幸存者区域时,年龄值会增加。
- 移动如下
- S0中有存活对象,S1为空 -> 将Eden区和S0中存活对象移动到S1
- S1中有存活对象,S0为空 -> 将Eden区和S1中存活对象移动到S0
- 移动时,年龄值增加,幸存的物体被移动到另一个幸存者区域。
老一代
- 特征
- 在年轻代中存活的对象,当其年龄值超过一定值时,将被移至老年代。
- 以上步骤称为促销
烫发区
- 特征
- 元数据、类信息等存放的地方
- 从Java 8开始改为元空间
Minor GC & Major GC & Full GC
- GC根据组 织的堆区域分为Minor GC、Major GC和Full GC。
小GC
- 特征
- GC发生在年轻代
- 将幸存的对象从 Eden 区 移动到 Survivor 区
- 当Survivor区满时,将幸存的对象移动到Old Generation
- 命令
- 当Eden区已满时发生Minor GC
- 将幸存的物体从Eden区和Survivor区移动到空的Survivor区
伊甸园 + S0 -> S1
或 伊甸园 + S1 -> S0
- 移动时年龄值增加
Major G.C.
- 特征
- GC发生在老年代
- Major GC发生在Old Generation区域已满时。
- 从老一代区域中删除无法访问的对象
完整GC
- 特征
- 在Young Generation、Old Generation和Perm区域执行GC
- 当Full GC发生时,所有线程都停止。
- 发生Full GC时,Major GC、Minor GC、Perm区GC都会发生。