JVM 【Java的堆内存分析】

2018年6月7日 作者 jacky
  • 内存溢出(OOM)的原因
  • MAT使用基础
    • 浅堆(Shallow Heap)与深堆(Retained Heap)
    • 显示入引用(incoming)和出引用(outgoing)
    • 支配树
  • 使用Visual VM分析堆
  • Tomcat OOM分析案例

内存溢出(OOM)的原因?

在JVM中,有哪些的内存空间?

堆溢出

永久区

Java栈溢出

这里的栈溢出指,在创建线程的时候,需要为线程分配栈空间,这个栈空间是向操作系统请求的,如果操作系统无法给出足够的空间,就会抛出OOM

直接内存溢出

  • ByteBuffer.allocateDirect()无法从操作系统获得足够的空间

遇到内存溢出后,应该如何思考和处理问题?

MAT使用基础



使用Visual VM分析堆

OQL查询

返回引用了(0,0)这个点的所有对象

实验:Tomcat的OOM案例

  • Tomcat OOM
    • Tomcat 在接收大量请求时发生OOM,获取堆Dump文件,进行分析。
  • 使用MAT打开堆
  • 分析目的:
    • 找出OOM的原因
    • 推测系统OOM时的状态
    • 给出解决这个OOM的方法

确认是否有大量session

解决方法:

  1. OOM由于保存session过多引起,可以考虑增加堆大小
  2. 如果应用允许,缩短session的过期时间,使得session可以及时过期,并回收