JVM OOM分析思路

Java堆发生OutOfMemoryError分析思路:查看堆存储快照,首先确认内存中的对象是否都是必要的(即可定位是发生了内存泄漏,还是的确是内存溢出)。
分析是否是内存泄漏:查看GC Roots的引用链,从而定位泄漏内存的代码位置。
如果是内存溢出:看是否可以调整-Xmx,-Xms。然后检查某些生命周期过长的对象是否是必要存在的。

注:在JDK1.7以后,字符串常量池被移到了堆中。

产生OutOfMemoryError实验:只要不断申请新对象,并使GC Roots到这个对象可达即可(不被回收)。

虚拟机栈和本地方法栈溢出:虚拟机栈和本地方法栈的大小都是使用-Xss参数配置(这是为单个线程分配的大小)。
单线程情况下:所有栈内存都给当前线程使用,所以说,栈的深度不断增加,将会发生StackOverflowError。

多线程情况下:堆,方法区的内存大小是确定的,程序计数器的忽略不计。那么剩下的内存则由虚拟机栈和本地方法栈瓜分。如果-Xss设置的越大,那么可建立的线程数就越小。所以说,如果要多建立几个线程,则要控制-Xss或者减小堆大小。

方法区溢出:
运行时常量池:
方法区其它区域存储的是:常量,静态变量,即时编译器编译产生的代码,虚拟机加载的类信息。所以说我们可以用动态生成类来产生异常。在spring等框架中,使用字节码增强技术动态产生了类,可能就会方法区溢出。

直接内存溢出:可通过:-XX:MaxDirectMemorySize指定,如果不指定,则默认与-Xmx一样大
溢出解决思路:如果发生了OOM,但Dump很小 && 程序直接或间接使用了NIO,则查看一下是否是直接内存溢出的缘故。

你可能感兴趣的:(JVM OOM分析思路)