JVM之OutOfMemoryError

1、堆溢出 将堆的最大值和最小值设置成一样的即可避免堆自动扩展,通过参数-XX:+HeapDumpOnOutOfMemoryError可以在异常时Dump出堆转储快照便于以后分析。
2、虚拟机栈和本地栈溢出 -Xoss(设置本地方法栈大小) -Xss(设置虚拟机栈大小) 两种异常 StackOverFlowError and OutOfMemoryError。 如果建立过多线程导致内存溢出,在不能减少线程或者是更换64bit虚拟机的情况下,就只能通过减少最大堆内存和减少栈容量来换取更多的线程。
3、方法区和运行时常量池溢出 JDK1.7开始逐步去永久代 方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等
4、本机直接内存溢出 DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx)一样。由DirectMemory导致的内存溢出,一个明显的特征是在HeadDump文件中不会看见明显的异常,如果发现OOM之后Dump文件很小,可考虑这方面的原因。

评论已关闭。