考虑方面

  1. 考虑内存分配确实过小。
  2. 内存泄露
    1. 对象频繁申请没有释放,比如从DB加载几万行记录,线程池的等待队列暴增的问题。
    2. 资源频繁申请没有释放,比如不断创建线程,发起socket。

排查步骤

  1. jps
    1. 定位jvm进程的PID
  2. jmap -heap pid
    1. 查看jvm中的新老代的堆内存配置,和使用情况(判断是否分配过小)。
  3. jmap -histo:live pid | more
    1. 查看jvm中存活对象的信息,并按内存占用大小排序。
      1. 实例数
      2. 占用内存
      3. 类名
    2. 针对占用内存较多的实例进行针对性review,如果是业务类的话就更容易看出问题。
    3. 注意:该命令会执行一次fgc,注意线上影响。
  4. jmap -dump:format=b,file=m.dump pid
    1. 手动持久化内存快照
    2. 自动持久化内存快照
      1. -XX:+HeapDumpOnOutOfMemoryError
      2. -XX:HeapDumpPath=/home/liuke/jvmlogs/
    3. dump分析工具
      1. Eclipse Memory Analyzer
      2. MAT