JVM的垃圾回收机制(GC机制)

简介: Java的JVM实行自动垃圾回收机制(GC),主要针对堆中的对象。当对象无引用可达时,被视为垃圾。垃圾回收包含“找垃圾”和“回收垃圾”两步。找垃圾通过引用计数(非Java使用)和可达性分析(Java使用)来识别无用对象。可达性分析从根对象开始遍历,未被标记的对象视为垃圾。回收垃圾常用标记清除方法,但可能导致内存碎片。此过程消耗资源,且碎片化影响内存分配效率。

在Java代码运行的过程中,JVM发现 某些资源不需要再使用的时候,就会自动把资源所占的内存给回收掉,就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”,“垃圾回收机制”也称"GC机制"。

对于Java代码来说,"垃圾回收机制"的回收对象就是"堆"上的对象。因为"栈"上的局部变量,跟随栈帧的生命周期,一个方法执行结束,栈帧销毁,内存也就释放了;"方法区"中的静态变量,跟随着"类"的生命周期,因此静态变量是在程序运行期间始终存在的,无需释放。那么"垃圾"就是 "堆"中的对象。

垃圾回收机制可以分为两大步骤:"找垃圾","回收垃圾"。

  1. 找垃圾
    "找垃圾"有两种方式,分别是 引用计数(python的方式) 和 可达性分析(Java的方式)。

1.1 引用计数
对于一个new出来的对象,会单独安排一块内存空间 来保存一个计数器。这个计数器 就用来描述当前这个对象 有几个引用指向它。当计数器为0时,也就意味着没有引用指向这个对象了,那么这个对象就是"垃圾"了。

1.2 可达性分析
在Java代码运行的过程中,会有一个或一组扫描线程,周期性地扫描代码中的所有对象。这个扫描线程,会从一些特定的对象出发,尽可能地进行遍历访问,把所有能够访问到的对象 标记为 可达。反之,经过扫描之后,没有被标记的对象,就是"垃圾"了。可达性分析 是周期性地进行,会消耗一定地系统资源。

  1. 回收垃圾
    2.1 标记清除
    把找到的"垃圾"对象直接释放掉,这就是标记清除的回收方式。这种方式并不好,因为这样的回收垃圾的方法会导致内存中有很多的内存碎片。随着程序的运行,内存碎片会越来越多,这就会导致后续申请内存空间时非常困难。回收垃圾的目的本就是为了释放内存空间,从而让其它进程申请到内存空间,但这种释放内存的方式并没有达到想要的效果。

如下图,虽然此时内存中共有3MB的空闲内存,但都不是连续的,因此其它进程只能申请到小于等于1MB的内存。

目录
相关文章
|
4天前
|
存储 算法 Java
先有JVM还是先有垃圾回收器?
是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,先有垃圾回收再有JVM。下面我们就来刨析刨析JVM的垃圾回收~
13 0
先有JVM还是先有垃圾回收器?
|
4天前
|
安全 算法 Java
深入浅出JVM(十三)之垃圾回收算法细节
深入浅出JVM(十三)之垃圾回收算法细节
|
4天前
|
存储 算法 Java
深入浅出JVM(十二)之垃圾回收算法
深入浅出JVM(十二)之垃圾回收算法
|
4天前
|
算法 Java PHP
JVM 的垃圾回收机制以及垃圾回收算法的详解
JVM 的垃圾回收机制以及垃圾回收算法的详解
10 0
|
4天前
|
监控 算法 安全
JVM工作原理与实战(三十九):G1垃圾回收器原理
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了G1垃圾回收器执行流程、年轻代回收原理、卡表(Card Table)、记忆集的生成流程、年轻代回收的详细步骤、混合回收的步骤、初始标记、并发标记、SATB、转移等内容。
22 0
|
4天前
|
监控 Java Linux
JVM工作原理与实战(三十七):Shenandoah GC和ZGC
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收器的技术演进、Shenandoah GC、ZGC等内容。
18 0
|
4天前
|
存储 缓存 监控
JVM工作原理与实战(三十四):解决GC问题的方法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了常见的垃圾回收(GC)模式、解决GC问题的方法(优化基础JVM参数、减少对象产生、更换垃圾回收器、优化垃圾回收器的参数)等内容。
18 0
|
4天前
|
Prometheus 监控 Cloud Native
JVM工作原理与实战(三十三):监控GC过程的工具
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了jstat工具、VisualVM插件、Prometheus + Grafana、GC日志等内容。
18 0
|
4天前
|
监控 负载均衡 算法
JVM工作原理与实战(三十二):GC调优
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了GC调优、GC调优的核心指标等内容。
13 0
|
4天前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常