GC的速度和堆的内存中存活对象的数量有关,与堆内存所有的对象无关 , GC的速度和堆内存的大小无关 , 如一个4GB大小的堆内存和一个16GB的堆内存 , 只要2个堆内存存活对象都是一样多的时候,GC速度都是基本差不多 。每次垃圾回收也不是必须要把垃圾清理干净,重要的是保证不把正在使用的对象给标记清除掉 。
2.2 堆内存管理JVM中占用内存空间最大的是堆内存,平常对象的创建大部分都是在堆上分配内存的,是Java垃圾回收的主要目标和方向、是 Java内存管理机制的核心组成部分,它可以自动管理 Java程序的内存分配和释放,Java垃圾收集器可以自动检测和回收不再使用的内存,以便重新分配给其他需要内存的程序 。这种自动内存管理的机制可以提高程序的运行效率和可靠性,防止因内存泄漏等问题导致程序崩溃或性能下降,Java 垃圾收集器使用了不同的垃圾回收算法和垃圾收集器实现 , 以适应不同的应用场景和需求 。Java垃圾收集器的性能特征和优化技术也是 Java程序员需要了解和掌握的重要知识 。
因此 , 了解 Java垃圾回收的背景、原理和实践经验对于编写高效、可靠的 Java程序非常重要 。
2.2.1 对象如何被判断为可回收
JVM怎么判断堆内存里面的对象是否可回收的,就是当一个对象没有任何引用指向它了,它就是可回收对象,判断的方式有两种算法,一个是引用计数法,一个是可达性分析法 。
可回收对象:

文章插图
(1)引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它时,这个计数器值加一,当引用失效断开时,计数器值就减一,在任何时刻时计数器为0的时候,代表这个对象是可以被回收的,没有任何引用使用它了 。

文章插图
引用计数法是有缺点,当对象直接互相依赖引用时,这些对象的计数器都不能为0,都不能被回收 。
(2)可达性分析法
它使用tracing(链路追踪)方式寻找存活对象的方法 , 通过一些列称为“GC Roots”的对象作为初始点,从这些初始点开始向下查找 , 直到向下查找没有任何链路时,代表这个对象可以被回收,这种算法是目前Java唯一且默认使用来判定可回收的算法 。

文章插图
2.2.2 GC Roots的概念和对象类型
- Java 虚拟机栈中引用的对象,例如各个线程被调用的方法栈用到的参数、局部变量或者临时变量等 。
- 方法区的静态类属性引用对象或者说Java类中的引用类型的静态变量 。
- 方法区中的常量引用或者运行时常量池中的引用类型变量 。
- JVM内部的内存数据结构的一些引用、同步的监控对象(被修饰同步锁) 。
- JNI中的引用对象 。
2.2.3 垃圾对象回收算法
当JVM定位到了那些对象可回收时,这个时候是通过三个算法标记清除 , 分别是标记清除算法、复制算法、标记压缩算法 。
(1)标记清除算法
首先标记出所有需要回 收的对象,在标记完成后,统一回收掉所有被标记的对象 , 但是该算法缺点是执行效率低,当大量对象时需要大量标记和清理动作,而且容易产生内存碎片化,当需要一块连续内存时,会因为碎片化无法分配 。

文章插图
(2)标记压缩算法
标记压缩算法跟清除算法很像,只不过它对内存进行了整理,让存活对象都向内存空间的一端移动,然后将边界的其它对象全部清理 , 这样能达到内存碎片化问题,不过它比清除算法多了移步动作 。
推荐阅读
- Containerd容器管理
- 如何编写高性能的Java代码
- 淘宝的评价管理在哪里查看 淘宝的评价管理在哪里
- 微信授权管理在哪里怎么添加应用 微信授权管理在哪里
- 在他人土地上建厕所违反治安管理处罚法吗
- PGO 在Java应用程序中释放峰值性能:配置文件引导优化概述
- 韩国知名女模特,米兰时装周也坚持自我管理,不愧“女版金钟国”
- 酒店客房管理知识点 酒店客房管理知识
- 不良情绪的管理办法包括 不良情绪的管理办法
- 如何管理生成式AI
