idea 输出GC日志信息 并且分配内存

本文深入解析Java垃圾收集(GC)日志,介绍如何通过-XX:+PrintGCDetails打印详细的GC信息,理解新生代、老年代回收机制及Parallel Scavenge收集器的工作原理。同时,讲解如何通过调整JVM参数如-Xms、-Xmx、-XX:SurvivorRatio等优化内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打印日志信息 并且具体解释

在vm options处加入-XX:+PrintGCDetails
在这里插入图片描述

package cn.tukk.otherTest;



public class TestGC {
    public Object instance=null;
    private static final int  _1MB=1024*1024;
    private byte[] bigSize=new byte[2*_1MB];

    public static void main(String[] args) {
        testGC();
    }
    public static void testGC(){
        TestGC objA = new TestGC();
        TestGC objB= new TestGC();
        objA.instance=objB;
        objB.instance=objA;

        objA=null;
        objB=null;

        System.gc();
    }
}

在这里插入图片描述

刚开始的GC日志开头的“[GC(System.gc())]”和”[Full GC(System.gc())]”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的,
如果是”Full”,说明这次发生了Stop-The-World的停顿(停顿了所有java线程),而System.gc()表示这次垃圾收集是由于执行了System.gc()产生的

后面的”[PSYoungGen]”表示GC发生的区域,YoungGen自然表示是新生代区域,这里的发生区域是和GC收集器相关的,这里是“PSYoungGen”表示是Parallel Scavenge收集器,如果是ParNew收集器,将会是”[ParNew]”,如果是Serial收集器绘制”[DefNew]”意为”Default New Generation”
那自然,后面的”[ParOldGen]”表示的是老年代回收

PSYoungGen total:表示新生代可用空间(Eden区加上一个Survivor区)
from space和to space分别表示两个survivor的空间
ParOldGen自然表示的就是老年代的空间

重新设置jvm参数
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大

-XX:+PrintGCDetails      //打印GC详细信息
-Xms100M    //堆大小100M
-Xmx200M   //堆最大占用内存
-Xmn10M     //新生代 大小 
-XX:SurvivorRatio=8   //Eden:Survivor1:Survivor2 = 8:1:1
-XX:MaxPermSize30M   //永久代内存大小
-XX:MetaspaceSize=30M  //元空间 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize=300M //最大空间,默认是没有限制的。

在这里插入图片描述

### 3.3 使用 IntelliJ IDEA 排查 Java 应用中的 `OutOfMemoryError` 问题 当在 IntelliJ IDEA 中运行或调试 Java 应用时,出现 `java.lang.OutOfMemoryError: Java heap space` 或 `GC overhead limit exceeded` 错误,通常表明 JVM 堆内存不足以支撑当前的程序运行需求。这类问题可以通过调整 IDE 的 JVM 参数、分析堆转储文件以及优化代码结构来排查和解决。 #### 3.3.1 调整 IntelliJ IDEA 启动参数以增加堆内存 IntelliJ IDEA 默认分配的 JVM 内存可能不足以支持大型项目编译或高并发应用的运行。可通过修改其配置文件 `idea64.vmoptions`(Windows)或 `idea.vmoptions`(Linux/macOS),调整如下参数: ```text -Xms512m -Xmx2048m -XX:ReservedCodeCacheSize=512m ``` 其中 `-Xmx2048m` 表示最大堆内存设置为 2GB。若仍然遇到内存溢出问题,可进一步提升至 4GB 或更高,但需确保系统物理内存充足[^1]。 #### 3.3.2 启用 GC 日志并分析垃圾回收行为 通过在 VM options 中添加以下参数启用 GC 日志输出: ```bash -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log ``` 结合工具如 GCViewer 或 GCEasy 分析日志内容,观察 Full GC 频率与堆内存变化趋势,判断是否存在频繁 Full GC 或对象持续增长的情况[^2]。 #### 3.3.3 利用 IDEA 内置功能生成堆转储文件 当发生 `OutOfMemoryError` 时,JVM 可自动生成堆转储文件用于后续分析。可在启动参数中加入: ```bash -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/ ``` IDEA 提供了集成的内存分析工具(如 Memory View 和 Debugger),也可以将 `.hprof` 文件导出至 VisualVM 或 Eclipse MAT 进行深入分析,识别占用内存最多的类及实例引用链[^3]。 #### 3.3.4 检查代码逻辑避免大对象创建与资源泄漏 重点关注以下常见导致内存压力的代码模式: - 大量使用 `byte[]`、`char[]` 或 `String` 缓存数据。 - 在 HTTP 请求处理中频繁创建临时对象,尤其是未及时释放的大集合、流对象等。 - 线程池配置不当,导致线程数量过多,每个线程默认栈大小为 1MB,也会显著增加堆内存消耗。 建议对关键路径进行性能剖析,使用 IDEA 的 CPU/内存分析器定位热点方法和对象分配情况。 #### 3.3.5 禁用 GC 开销限制作为临时缓解措施 若因 `GC overhead limit exceeded` 报错而无法完成构建,可尝试临时禁用该限制: ```bash -XX:-UseGCOverheadLimit ``` 此方法仅适用于紧急恢复服务,并不能从根本上解决问题,仍需配合其他诊断手段定位根本原因[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值