跳至正文

什么是 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都会发生。

来源