内存溢出和内存泄漏区别
内存溢出
Out Of Memory
是指程序在申请内存时,没有足够的内存空间供其使用,出现Out Of Memory
内存泄漏
Memory Leak
是指程序在申请内存后,由于某种原因无法释放已申请的内存空间,导致这块内存无法再次被利用,造成系统内存的浪费
memory leak会最终会导致out of memory。
内存溢出分类
栈内存溢出(StackOverflowError)
程序所要求的栈深度过大导致,可以写一个死递归程序触发。
如何解决
一般是程序问题,最大可能是递归程序有问题,如果确认程序没问题,就改变-Xss 标识来增加线程栈的大小
堆内存溢出(OutOfMemoryError : java heap space)
(1)如果是内存溢出,则通过 调大 -Xms,-Xmx参数。
(2)如果是内存泄露,则看对象如何被 GC Root 引用。
如何解决
持久代内存溢出(OutOfMemoryError: PermGen space)
持久代中包含方法区,方法区包含常量池。
因此持久代溢出有可能是(1) 运行时常量池溢出,也有可能是(2)方法区中保存的Class对象没有被及时回收掉或者Class信息占用的内存超过了我们配置。
用String.intern()触发常量池溢出。
Class对象未被释放,Class对象占用信息过多,有过多的Class对象。可以导致持久代内存溢出。
无法创建本地线程
Caused by: java.lang.OutOfMemoryError:unable to create new native thread
系统内存的总容量不变,堆内存、非堆内存设置过大,会导致能给线程分配的内存不足。