java.lang.OutOfMemoryError定位

问题描述:


 

系统前台内存实例溢出,堆内存突然陡增。发现此问题时,马上联系运维获取jmap -dump:file=/dump.bin 32665,获取堆内存信息;

但是由于内存占用问题,出现下面异常信息,导致获取队内存信息失败;

 

Exception in thread "main" java.lang.reflect.InvocationTargetException
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at sun.tools.jmap.JMap.runTool(JMap.java:179)
  at sun.tools.jmap.JMap.main(JMap.java:110)
Caused by: sun.jvm.hotspot.debugger.UnmappedAddressException

 

 

这样的获取方式太慢,获取失败,而如果实例挂掉后,内存信息不能dump。

问题处理:

配置jvm启动参数, -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/home/tomcat/xxxx.com.该参数当JVM发生OOM时,自  动生成DUMP文件,如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof。

当再次发生溢出时,联系运维获取改hprof文件,可用Eclipse Memory Analysis,或者jprofile打开分析;

eclipse:MAT插件安装http://www.eclipse.org/mat/downloads.php

使用技巧,参见博文:http://mikewang.blog.51cto.com/3826268/1254306

分析日志文件

TaskInfoRelation对象实例较多, 实例到300多万个,分析前台什么地方会做关于这表的查询,而舆情前台在任务加载时,会获取该信息,但是这么多实例显然是不正常的,一定是某个地方查询了所有扫描了全表;



 

总结:

1.对于实体,除去insert、update、batchInsert、delete操作外其他任务接口,应该明确定义接口职责,禁止使用VO对象动态拼接where条件;

2.jvm实例配置参数

 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/home/tomcat/xxxx.com,第一次出现

OutOfMemoryError时,及时定位修复

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值