java内存溢出(OutOfMemoryError)————dump文件以及内存分析


文章目录
java内存溢出(OutOfMemoryError)————dump文件以及内存分析
1.dump内存快照
        1.1.测试环境(程序启动)
        1.2.生产环境(程序运行时)
2.分析快照文件
3.测试
        3.1.程序(运行时)
        3.2.jmap生成内存快照文件
        3.3.MAT分析
                3.3.1.下载
                3.3.2.使用

当程序出现以下错误时:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java metaspace
java.lang.OutOfMemoryError: Java Perm Gen

1.dump内存快照
1.1.测试环境(程序启动)
##启动时加上下面两个参数

#1.开启程序出现内存溢出错误时自动dump出内存快照文件,后缀:.hprof  强烈建议无论何种环境,加上此参数
-XX:+HeapDumpOnOutOfMemoryError 
#2.指定出内存快照文件的路径
-XX:HeapDumpPath=./

1.2.生产环境(程序运行时)
##如果生产环境中启动时未加上-XX:+HeapDumpOnOutOfMemoryError参数,如果想在不关闭程序的情况下dump内存快照文件

#1.获取java程序的pid,使用jps命令获取pid
jps
#2.使用jmap命令dump文件到指定路径:filepath:文件路径 xxx.hprof pid:java程序的pid
#示例:jmap -dump:live,format=b,file=./test.hprof 42156
jmap -dump:live,format=b,file=<filepath> <pid>

2.分析快照文件
使用Jprofiler(收费,功能强大)
使用MAT(MemoryAnalyzerTool,免费)
3.测试
3.1.程序(运行时)
public static void main(String[] args) throws InterruptedException {
        Map<String,Object> memMap=new HashMap<>();
        for (int i = 0; i <128 ; i++) {
            byte [] b=new byte[1024*1024];
            memMap.put("k"+i,b);
            //模拟程序运行中
            Thread.sleep(1000);
        }
    }

//启动参数: -Xmx128m -Xms128m

3.2.jmap生成内存快照文件
#1.获取java程序的pid,使用jps命令获取pid
jps
#2.使用jmap命令dump文件到指定路径:filepath:文件路径 xxx.hprof pid:java程序的pid
#示例:jmap -dump:live,format=b,file=./test.hprof 42156
jmap -dump:live,format=b,file=<filepath> <pid>

3.3.MAT分析
3.3.1.下载
路径:https://www.eclipse.org/mat/downloads.php

3.3.2.使用
1.打开文件


2.内存溢出的可能原因


3.java对象引用分析(树形)

### Java 中 `OutOfMemoryError: Java heap space` 错误的原因 当 JVM 报告 `OutOfMemoryError: Java heap space` 时,意味着堆内存不足以完成程序执行中的某项操作。这可能是由于两种不同情况引起的:内存溢出 (Out of Memory)内存泄漏 (Memory Leak)[^1]。 #### 内存溢出原因分析 内存溢出指的是应用程序尝试分配的对象所需内存量超过了可用的最大堆空间大小。即使垃圾回收器已经尽力释放不再使用的对象所占用的空间,仍然无法满足新的内存请求。常见场景包括: - 创建了过多的大尺寸对象实例; - 数据结构设计不合理,导致不必要的大量数据驻留在内存中; - 处理大规模的数据集而未考虑分页加载或流处理方式; 为了应对这种情况,在开发阶段应优化算法效率并合理规划资源使用策略。另外可以通过调整JVM启动参数来增加最大堆容量,例如通过设置 `-Xmx` 参数指定更大的值[^2]。 ```bash java -Xmx512m MyApplication ``` #### 内存泄漏原因解析 相比之下,内存泄漏是指某些无用但又未能被及时回收的对象持续占据着宝贵的堆内存区域,从而使得剩余可利用的自由存储量逐渐减少直至耗尽。具体表现形式有: - 静态集合类持有过期对象引用而不清理; - 缓存机制缺乏有效的淘汰规则; - 线程局部变量(ThreadLocal)不当管理造成循环引用; 这类问题通常难以察觉,因为表面上看似乎并没有超出预期范围内的正常业务逻辑运作。要检测是否存在此类隐患,则需借助专业的性能监控工具来进行深入剖析,并结合代码审查找出潜在风险点加以修正。 #### 如何区分两者? 最直观的区别在于应用行为模式的不同——如果每次运行相同功能模块都会稳定地消耗更多内存直到崩溃,则更倾向于认为是内存泄漏所致;反之若是特定条件下偶尔发生一次性的异常则可能属于一次性大对象创建引发的瞬时间接性内存不足即内存溢出现象。 此外还可以观察GC日志以及Heap Dump文件辅助判断实际状况。对于前者而言,频繁触发Full GC却依旧无法缓解压力往往暗示存在泄露可能性较大;后者能够提供更为详实具体的对象分布详情以便进一步定位根本成因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值