堆溢出java
会出现java.lang.OutOfMemoryError,紧接着还会跟一条Java heap space,at…多线程
先经过内存映像分析工具堆dump出来的堆快照分析,分清楚是内存泄漏仍是内存溢出工具
对于内存泄漏,查一下GC Roots的引用链,掌握泄露对象的类型信息及GC Roots引用链的信息,定位出问题的地方spa
对于内存溢出,看看-Xms和-Xmx,看看能不能调大,从代码上检查是否有些对象生命周期过长等线程
虚拟机栈和本地方法溢出对象
Hotspot中不区分虚拟机栈和本地方法栈,因此对于它来讲-Xoss(设置本地方法栈大小)没啥用,栈容量只由-Xss来设置生命周期
通常来讲,默认的Xss够用了,并且即便爆栈也会有足够的提示来解决,有的32位系统受限于寻址能力,由于多线程引发爆栈,有时候须要减小Xmx和减小栈容量来换取更多的线程内存
运行时常量池溢出和方法区溢出虚拟机
因为常量池分配在方法区内,能够经过-XX:MaxPermSize和-XX:MaxPermSize来限制方法区大小达到间接限制常量池的目的内存泄漏
运行时常量池溢出也会抛OOM,可是后面提示的信息是PermGen space,说明运行时常量池属于方法区,也就是Hotspot中用就带的一部分
本机直接内存溢出
能够经过-XX:MaxDirectMemorySize指定,若是不指定默认与Java堆的最大值-Xmx同样,虽然用DirectByteBuffer分配内存也会致使溢出,可是抛异常时只是经过计算得知没法分配,并无真正向OS申请分配内存,真正申请分配内存的方法是unsafe.allocateMemory()