JVM系列:垃圾回收器(GC)

JVM系列:垃圾回收器(GC)

😀 执行引擎将class文件加载至JVM内存中运行。在运行过程中,需要在内存中动态创建和销毁对象。在传统的C/C++语言中,需要手动进行对象销毁以避免内存泄漏。而在Java中,引入了GC垃圾回收机制。

GC垃圾回收是JVM的标志性功能,无论是性能优化还是面试准备,GC都是JVM的重要内容。JVM不断对GC进行设计和优化,几乎每个Java版本都会对GC进行改进。在这里以目前使用最广泛的JDK8为例,梳理GC部分的主要内容。

📝 主旨内容

在文章之前,先来熟悉以下Arthas工具,这是第三方在线监控工具,由阿里开源。

为什么不直接介绍垃圾回收器呢?

前言中说到class文件会被加载到JVM内存中执行,这个过程不是可视的,而借助这个工具,我们可以对更可观地理解JVM底层,同时这个工具也可用于对Java进程进行性能调优,后续在JV吗M调优文章中介绍Arthas工具的具体用法。

官网地址:arthas.aliyun.com/

我们使用一个例子来细说。

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        List arr = new ArrayList<>();
        for(int i = 0 ; i < 1000_000 ; i ++){
            arr.add(new String("GCtest GCdemo Ber 鳄鱼儿"));
            Thread.sleep(100);
        }
    }
}

注明:1000_000 效果等于 1000000。

这是Java7引入的新特性。分割数字增强可读性。具体可以在这里阅读更多设计细节,Underscores in Numeric Literals

下载atthas后解压,在解压路径下终端运行 java -jar arthas-boot.jar 启动,并根据提示选择上述例子运行的pid序号,这里序号为 3

通过 dashboard 指令就可以查看这个Java程序的实时运行状态。

在这些信息中,我们重点关注Memory部分,这部分记录了该Java程序的JVM内存使用情况。

表中GC栏部分则展示了垃圾回收的执行情况。从这个表入手分析一个Java程序,我们就可以更方便地了解一个Java进程是如何进行管理内存的。

在Memory这部分,我们还可以知道,Java进程会将其管理的内存分为heap(堆区)和nonheap(非堆区)。

非堆区包括code_cache(热点指令缓存)、metaspace(元空间)和compressed_class_space(压缩类空间)。这部分可以看作Java进程的地下室,属于较不活跃的部分。而heap堆区则类似于客厅,是Java中最关键的部分。堆区主要分为eden_space、survivor_space和old_gen三个部分,构成了JVM内存的主体。

如上图所示,堆区是JVM中存放对象的核心内存区域。它的大小可以通过参数-Xms(初始堆内存大小)和-Xmx(最大堆内存)指令来设置。

堆内存是可以动态扩展的,如果初始内存不足,JVM会自动扩大堆内存。然而,当内存扩展到达最大堆内存限制时仍然不足时,JVM就无法继续扩展,会导致OutOfMemory(OOM)异常。

GC垃圾回收器的作用就是及时回收这些内存空间,使得内存可以被重复利用。

📎 参考文章

相关推荐
我是一颗柠檬16 分钟前
【MySQL全面教学】MySQL性能优化实战Day13(2026年)
数据库·后端·sql·mysql·性能优化·database
小江的记录本42 分钟前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
程序员cxuan1 小时前
我花了两天时间,终于把 Codex 额度掉太快的问题整明白了!!
人工智能·后端·程序员
IT_陈寒1 小时前
Vue这个动态响应坑把我整不会了
前端·人工智能·后端
金銀銅鐵1 小时前
[Java] 用图形化界面演示 iadd, isub, iconst_<i> 指令的效果
java·后端·python
AskHarries1 小时前
做国内还是出海
后端
日月云棠2 小时前
10 Integer —— 最常用的整数包装类深度解析
java·后端
大鸡腿同学2 小时前
大模型为何总 “胡说八道”?做完 RAG 知识库,我看懂了它的底层逻辑
后端
一 乐2 小时前
高校实习信息发布网站|基于Spring Boot的高校实习信息发布网站的设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·高校实习信息发布网站
安久12 小时前
springboot图片上传至服务器本地保存
后端