OOM异常后GC收集日志信息

当遇到Java OOM异常时,通过设置-Xms和-Xmx参数引发异常,并观察GC日志。文章详细分析了日志中的关键信息,特别是OOM前的最后一次Full GC,以理解内存使用情况。

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

OOM异常后GC收集日志信息

我们先对-Xms -Xmx等参数做一个设置 方便来出现OOM异常(我们将堆的大小设定为10m)

在这里插入图片描述

我们的测试代码

package com.zyk;

import java.util.Random;

public class JVMTest {
    public static void main(String[] args) throws  Exception{
       /* long maxMemory =Runtime.getRuntime().maxMemory();
        long totalMemory =Runtime.getRuntime().totalMemory();
        System.out.println("-Xmx:MAX_MEMORY  =  "+maxMemory+"字节"+(maxMemory/(double)1024/1024)+"MB");
        System.out.println("-Xms:TOTAL_MEMORY  = "+totalMemory+"字节"+(totalMemory/(double)1024/1024)+"MB");*/
        String str = "hello";
        while (true) {
            str += str + new Random().nextInt(988898989) + new Random().nextInt(799898989);
        }
    }
}

结果图

在这里插入图片描述

我们对红框选中的日志信息做一个简单分析

[GC (Allocation Failure)
[PSYoungGen: 2029K->504K(2560K)] 
2029K->676K(9728K), 0.0009753 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2029K->504K(2560K)]
 2029k:YongGC之前新生代的内存占用
 504k:YongGC之后新生代的内存占用
 2560k:新生代总共的大小(堆内存我们分配了10m 这里新生代大致分配了三分之一)
2029K->676K(9728K)
2029k:YongGC之前JVM堆的内存占用
676k:YongGC之后JVM堆的内存占用
9728k:JVM对的总大小(约等于我们分配的10m)

这张图片展示的更加清楚

在这里插入图片描述

我们在对OOM之前最后一次的FullGC做一次分析
在这里插入图片描述

[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)]
[ParOldGen: 5040K->5020K(7168K)] 
5040K->5020K(9216K),
[Metaspace: 3502K->3502K(1056768K)], 0.0075995 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs] 
[ParOldGen: 5040K->5020K(7168K)] 
5040k:GC前old区占用的空间大小
5020k:GC后old区占用的空间大小
7168k:old区总大小
5040K->5020K(9216K),
5040k:GC前JVM堆的内存占用
5020k:GC后JVM堆的内存占用
9216k:JVM堆的总大小(约等于young区加old区的大小)
### 关于 Autodl 中 OOM 错误日志的记录方法 在深度学习框架中,尤其是像 TensorFlow 和 PyTorch 这样的工具,在 GPU 上运行模型时可能会遇到 Out-of-Memory (OOM) 的问题。对于 Autodl 平台而言,其提供了多种方式来帮助开发者诊断和解决此类问题。 #### 日志文件的位置 通常情况下,Autodl 将 OOM 错误的相关信息存储在其默认的日志目录下。具体路径可能因环境配置而异,但一般位于 `/autodl/logs` 文件夹内[^1]。此文件夹包含了由平台自动生成的各种日志文件,其中包括系统资源使用情况以及潜在的异常堆栈跟踪信息。 #### 查看 OOM 日志的方法 为了更高效地找到与内存管理有关的具体错误提示,可以采用如下几种手段: 1. **通过命令行访问日志** 使用 SSH 登录到远程服务器后,执行 `tail -f /autodl/logs/*.log` 命令能够实时监控最新的活动日志条目。如果程序崩溃并抛出了 OOM Exception,则这些消息会被迅速捕捉到终端显示出来[^2]。 2. **利用 TensorBoard 调试功能** 如果项目集成了 TensorBoard 工具作为可视化界面的一部分,那么也可以借助它分析训练过程中的性能瓶颈所在之处。启动服务之后打开浏览器输入地址 http://localhost:6006/#scalars 可以观察不同阶段下的显存占用趋势图谱变化曲线[^3]。 3. **编写自定义脚本捕获异常** 下面给出了一段 Python 示例代码片段用于检测是否存在超出分配给定设备容量的情况,并将相应事件写入单独创建的新文档当中保存起来以便后续审查。 ```python import torch try: model = YourModelClass() # 替换为实际使用的模型类名 input_data = ... # 准备好输入数据张量形式 output = model(input_data) except RuntimeError as e: with open("/path/to/custom_oom_log.txt", 'a') as f: f.write(str(e)) ``` 上述代码块展示了当尝试加载过大尺寸的数据样本至GPU上计算时所触发的一个典型场景处理逻辑[^4]。 #### 提升效率建议 除了单纯依赖事后排查机制外,还可以采取一些预防措施减少发生概率比如调整批量大小参数(batch size),或者启用混合精度模式(mixed precision training)[^5]等策略优化整体流程表现水平从而降低风险几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值