JVM----GC(垃圾回收)详解

一、Automatic Garbage Collection(垃圾回收)简介

Automatic Garbage Collection (自动垃圾回收)是JVM的一个特性,JVM会启动相关的线程,该线程会轮训检查heap memeory,并确定哪些是未被引用的(unreferenced),即未被使用的;哪些是被引用的(referenced),即正在使用的。

在C/C++语言中,对象内存的分配与回收,是手动进行分配与回收的,而在JVM中,JVM会使用垃圾回收器(一个线程),来自动对内存进行分配与回收。

二、GC基本机制简介

GC机制中,最常见最基本的方案是标记--清除法(Marking--Deletion),示例如下:

Step 1 : Marking

在垃圾回收机制中第一步通常是标记(Marking) ,该标记用于确认哪些是被引用的,标记哪些是未被引用的。

被引用的对象被标记为蓝色,未被引用的对象被标记为黄色。所有的对象都会被扫描用于做标记,有的时候该操作会非常耗时。

Step 2 :Normal Deletion

该节点会删除未被标记的对象,用于释放内存空间。

Step 2a : Deletion with Compacting

为了进一步提高性能,除了删除未引用的对象外,还可以压缩剩余的引用对象。通过将引用的对象移动到一起,这使得新的内存分配更加容易和快捷。

三、JVM Generations

为了提升JVM的性能,堆(heap memory )被分解为更小的部分或代(generations),即Young Generation, Old or Tenured Generation, and Permanent Generation。示例图如下:

Young Generation是新对象被分配的内存区域,并被标记上年龄值。当Young Generation内存空间被充满,将会触发一次minor garbage collection(触发的条件根据选择的垃圾回收器不同而不同)。minor garbage collection可以通过相关设置值来优化; 如果Young Generation中都是未被使用的对象(dead object),minor garbage collection效率会非常高,垃圾回收会很快。一些幸存的object会被标记年龄值,并最终转移到Old or Tenured Generation(老一代)。

Stop the World Event 每一次minor garbage collection 都会触发"Stop the World Event " 事件,这会导致应用中所有的线程会暂停,知道该垃圾回收操作完成。

Old Generation 会存储长期存活的object,一般的,会给对象的年龄值设置一个临界点,当对象的年龄值达到该临界点的时候,会被移到 Old Generation,最终当 Old Generation内存空间充满的时候会触发一次major garbage collection。

Major garbage collection 也会触发"Stop the World Event " 事件,Major garbage collection会非常慢,因为这涉及所有的 对象。

Permanent Generation 会存储一些JVM运行所需要的元数据,这些元数据描述了classes(类)、methods(方法)等。

相关推荐
NE_STOP几秒前
SpringBoot3-外部化配置与aop实现
java
ThinkPet7 分钟前
【AI】大模型知识入门扫盲以及SpringAi快速入门
java·人工智能·ai·大模型·rag·springai·mcp
程序员敲代码吗15 分钟前
如何从Python初学者进阶为专家?
jvm·数据库·python
派大鑫wink20 分钟前
【Day39】Spring 核心注解:@Component、@Autowired、@Configuration 等
java·后端·spring
输出输入36 分钟前
JAVA能进行鸿蒙系统应用的开发吗
java
a努力。36 分钟前
宇树Java面试被问:数据库死锁检测和自动回滚机制
java·数据库·elasticsearch·面试·职场和发展·rpc·jenkins
PwnGuo42 分钟前
Android逆向:在 Unidbg 中解决 native 函数内调用 Java 方法的报错
android·java·python
输出输入1 小时前
IJ IDEA 目录结构
java
Kratzdisteln1 小时前
【1902】预先生成完整的树状PPT结构
java·前端·powerpoint
Sylvia-girl1 小时前
Lambda表达式
java·开发语言