内存溢出的原因及解决办法
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可以设置这块区域。