jvm内存溢出原因及解决方案
内存溢出的原因及解决办法:参考:https://wenku.baidu.com/view/02e3040c0366f5335a8102d276a20029bd64630f.html
1.堆栈溢出
报错信息:java.lang.OutOfMemoryError:...java heap space...
造成原因:要么是代码问题(引用不当、一次从数据库中取的数据太多、或申请大对象导致),要么是访问量太多并且每个访问的时间太长或数据太多,导致数据释放不掉。
解决方法:排查代码,若代码没问题适当调整-Xmx和-Xms。
注:这个在溢出之前可能会报 java.lang.OutOfMemoryError:GC over head limit exceeded ,系统处于高频的GC状态。
2.PermGen溢出或PermGen满了
报错信息:java.lang.OutOfMemoryError:PermGen space
造成原因:系统代码非常多或使用第三方包非常多、代码中使用大量的常量,或通过动态代码加载等方法;
解决方法:增加 -XX:PermSize 和 -XX:MaxPermSize 的大小。
注:PermGen又称永久代,是为长期对象保留的空间。
3.使用ByteBuffer中的allocateDirect()的时候
报错信息:java.lang.OutOfMemoryError:Direct buffer memory
造成原因:在直接或间接使用 ByteBuffer 的 allocateDirect() 时,不做clear的操作,就会出现此问题。
解决方法:设置参数 -XX:MaxDirectMemorySize 。
注:很多javaNIO框架中会把 ByteBuffer 中的 allocateDirect()封装成其他的方法。
4.线程内存不足
报错信息:java.lang.StackOverflowError
造成原因:-Xss 太小了,代码中申请了很多局部调用的栈针内容存放在当前用户线程中。
解决方法:增加 -Xss 的大小。
注:线程在jdk1.4以前是256K,1.5以后是1M。
5.第五类错误
报错信息:java.lang.OutOfMemoryError:unable to create new native thread
造成原因:这个错误是无法为线程分配一块内存区域造成的;要么是本身内存就不够,要么是heap的空间设置的太大,导致剩余的内存不够。
解决方法:增加内存或适当设置 -Xmx 和 -Xms 的大小。
注:线程基本只占 heap 以外的内存区域。
6.地址空间不够
报错信息:java.lang.OutOfMemoryError:request {} byte for {}out of swap
造成原因:一般是由于地址空间不够导致的。
以下是一些参数的含义:
-Xmx:为Heap区域的最大值;
-Xms:为Heap区域的初始值;注:线上环境需要与 -Xmx 一致,否则 capacity 的值会来回飘动。
-Xss(或-ss):指一个线程的native空间;注:还有个参数 -XX:ThreadStackSize ,这两个参数会冲突,一般谁在后面谁生效。
-XX:PermSize与-XX:MaxPermSize:指class装载空间或者说是方法区(但不是本地方法区);注:只有Hotspot可以设置这块区域。