首行推荐——http://www.jianshu.com/p/ba0fdee47cb4java
为何会内存溢出?优化
由于装满了,装不下了...spa
好吧,其实提到内存溢出,不得再也不提到另外一个概念。线程
内存泄露。设计
什么是内存泄露,由于执行程序指令,引入数据,装载数据等等,都是须要内存空间的,内存空间也是有限的。
正常的程序执行,确定是开辟内存空间,运行程序指令(输入、输出),程序结束,释放空间。这样能够保证内存的往复利用。对象
可是,有时候程序设计有漏洞或是不够严谨的话,致使占用的内存没有获得释放,那么这一块内存就没办法再利用了,这就是内存泄露。递归
当不断出现内存泄露的时候,被占用的内存空间愈来愈多,最终到下一次须要使用内存空间的时候就会这样——空间不够了,溢出了。内存
对于Java,内存溢出分三种状况。get
一、OutOfMemoryError: PermGen space虚拟机
Permanent Generation space 这个区域主要用来保存加来的Class的一些信息,在程序运行期间属于永久占用的,Java的GC不会对他进行释放,因此若是启动的程序加载的信息比较大,超出了这个空间的大小,就会发生溢出错误;
解决的办法无非就是增长空间分配了——增长java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。
二、OutOfMemoryError:Java heap space
heap 是Java内存中的堆区,主要用来存放对象,当对象太多超出了空间大小,GC又来不及释放的时候,就会发生溢出错误。
Java中对象的建立是可控的,可是对象的回收是由GC自动的,通常来讲,当已存在对象没有引用(即不可达)的时候,GC就会定时的来回收对象,释放空间。可是由于程序的设计问题,致使对象可达可是又没有用(即前文提到的内存泄露),当这种状况愈来愈多的时候,问题就来了。
针对这个问题,咱们须要作一下两点:
一、检查程序,减小大量重复建立对象的死循环,减小内存泄露。
二、增长Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。
三、StackOverFlowError
stack是Java内存中的栈空间,主要用来存放方法中的变量,参数等临时性的数据的,发生溢出通常是由于分配空间过小,或是执行的方法递归层数太多建立了占用了太多栈帧致使溢出。
针对这个问题,除了修改配置参数-Xss参数增长线程栈大小以外,优化程序是尤为重要。
关于内存的问题,浅见如上。
做者:艾尔欧惟伊 连接:https://www.jianshu.com/p/8c31ef19983a 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。