`

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时,及时定位修复

 

  • 大小: 9.1 KB
  • 大小: 15.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics