图文讲解java垃圾回收机制

简介: 图文讲解java垃圾回收机制

1. JAVA GC 概述



JAVA GC采用了分代思想,将java堆分成新生代,年老代,永久代。GC算法主要有标记-清除,标记-压缩,复制算法。

  • 新生代:新生代被分成三个部分 eden区和2个survivor区(from和to两个分区)。当创建对象,需要jvm分配内存时,会在新生代的eden区寻找合适的内存区域。如果当eden区内存不够时,会触发minor GC。eden区存活对象和from区的存活对象将会被复制到to区。当to区的对象年龄超过了晋升的年龄设置,对象将被提升到老年代。新生代GC用的是复制算法
  • 年老代: 年老代里存放的都是存活时间较久的,大小较大的对象,因此年老代使用标记整理算法。当年老代容量满的时候,会触发一次Major GC(full GC),回收年老代和年轻代中不再被使用的对象资源。年老代算法用的是标记-清除
  • 永久代:指内存的永久保存区域,主要存放Class和Meta(元数据)的信息。Class在被加载的时候被放入永久区域。它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。


2. 图文描述标记-清除和标记-压缩



Step 1:标记(Marking)


GC的第一步叫做标记。在这个步骤GC通过遍历内存区辨别哪些内存在使用,哪些内容没有使用。并做好标记


image.png

如上图蓝色的表示存活的对象,金黄色表示垃圾对象。在标记阶段,需要扫描整个该内存区的对象,并标记。这个过程可能会比较耗时


Step 2: 清除(Normal Deletion)


清除阶段移除掉垃圾对象,并且用一个链表维护空闲的区域


image.png

内存分配器持有空闲内存区的引用,以便分配内存给新的对象


Step 2a: 压缩(Deletion with Compacting)


为了提升性能,在Step 2的基础上,在删除完垃圾对象后。我们可以把存活的对象移动到内存区的头部。这样下次分配内存的时候会更快。主要原因是标记-清除会造成比较大的内存碎片,每当需要分配内存时,都需要遍历空闲链表。而压缩算法,会把内存碎片整理成一个大的完整内存块。


image.png

3. 分代垃圾回收


3.1 为什么要采用分代垃圾回收?



正如前面所说,标记和压缩对象,对java虚拟机而言会比较耗时。当java虚拟机分配了越来越多的对象后。GC所花费的时间将会更长。然而根据经验分析,绝大多数的对象存活时间都比较短。这样我们可以把存活长的对象和存活短的对象隔离开。这样GC会更加高效


image.png


3.2 JVM分代


将jvm堆内存分割成更小的内存区,会提高jvm的gc性能。堆被分成 (新生代)Young Generation,(年老代)Old or Tenured Generation, and (永久代)Permanent Generation


image.png


  • 所有的对象都会在新生代中分配内存。当新生代内存不够的时候。将会出发minor GC。如果新生代中的对象存活时间都很短,那么minor GC的效率将会很高。如果新生代里面充满了垃圾对象,那么回收速度将会很快(因为标记的时间短了)。一些存活下来的对象年龄将会增加,并且最终会被移动到年老代
  • Stop the World Event:所有的minor GC都是"Stop the World"事件。这意味着除了GC线程,程序的其他线程对将暂停知道GC完成。Minor GC都是Stop the World Event
  • 年老代是用来存储长存活时间的对象。典型的我们可以给对象设定一个年龄界限,当新生代的对象存活年龄超过这个界限,对象将会从新生代移动到年老代。当年老代的内存不够的时候,将会出发Major GC。Major GC也是Stop the World Event。通常来说Major GC比Minor GC更慢,因为Major GC回收的是整个新生代和年老代的所有垃圾对象。因此对于响应性高的程序,应该尽量减少Major GC。需要注意的是Stop the World Event的时间受到在年老代中使用的垃圾回收器的影响,不受新生代的影响
  • 永久代包含了JVM的元数据。包括类信息,方法信息等。永久代由JVM在应用运行期生成。另外 javase的类库中的类信息也可能存放在这里


3.3 分代垃圾回收的处理过程


现在你明白为什么堆分成不同的世代,现在是时候看看这些空间是如何相互作用的。 下面的图片将介绍JVM中的对象分配和老化过程。


1. 一开始,任何新的对象都会在eden空间分配内存,两个survivor空间一开始都是空的


image.png

2. 当eden空间被填满了,minor GC将被触发


image.png


S0 survivor区对象里的 1 3表示对象的年龄


3. Eden空间的存活的对象将被复制到第一个survivor空间,年龄+1,垃圾对象将会被清除掉


image.png


4. 下一次minor GC发生时,Eden空间的存活对象将被复制到空闲的survivor空间S1(年龄+1),另外在前一次minor GC S0空间的存活对象也会被复制到S1(年龄+1),垃圾对象会被清除掉

image.png


5. 下一次minor GC发生时,还是重复第4条的内容,只是两个survivor空间对调了,这次是从S1复制到S0空间

image.png

6. 新生代晋升到年老代。当minor GC发生时,如果survivor空间中的对象年龄超过了晋升的年龄限定,对象会被复制到年老代

image.png

7. 当minor GC不断触发,将会有对象不断被晋升到年老代



image.png

8. 上面的图文完美的解释了minor GC的处理过程。最终,当年老代的内存被填满的时候,将会触发major GC。Major GC在年老代用的是标记压缩算法。同时新生代的对象将被清除

image.png


相关文章
|
3天前
|
算法 Java 程序员
深入理解Java的垃圾回收机制
【9月更文挑战第31天】在Java的世界里,有一个默默守护者,它负责清理不再使用的对象,确保内存的有效利用。这就是垃圾回收器(Garbage Collector, GC)。本文将带你一探究竟,了解它是如何工作的,以及为何我们需要关心它的存在。
|
5天前
|
监控 Java 程序员
深入理解Java中的垃圾回收机制
【9月更文挑战第29天】在Java编程的海洋中,垃圾回收(Garbage Collection, GC)是维持内存健康的灯塔。本文将带你探索GC的奥秘,从它的本质、工作机制到优化策略,让你的代码像海豚一样优雅地畅游。
|
6天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
18 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
9天前
|
监控 算法 Java
深入解析Java中的垃圾回收机制
本文旨在全面解析Java的垃圾回收机制,探讨其工作原理、常见算法以及在实际开发中的应用。通过对这一重要主题的深入分析,希望帮助读者更好地理解Java虚拟机(JVM)如何管理内存,从而编写出更高效、稳定的Java应用程序。
|
14天前
|
监控 算法 Java
Java中的内存管理与垃圾回收机制
本文将深入探讨Java编程语言中的内存管理方式,特别是垃圾回收(Garbage Collection, GC)机制。我们将了解Java虚拟机(JVM)如何自动管理内存,包括对象创建、内存分配以及不使用对象的回收过程。同时,我们还将讨论不同的垃圾回收算法及其在不同场景下的应用。
|
13天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
18天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
19 0
|
算法 Java
【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )
【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )
304 0
【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )
|
监控 算法 Java
【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
210 0
【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
|
算法 Java
【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )
【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )
133 0
下一篇
无影云桌面