java内存溢出是怎么回事

 
 

为什么会内存溢出?

因为装满了,装不下了...

好吧,其实提到内存溢出,不得不再提到另一个概念。

内存泄露。

内存泄露


什么是内存泄露,因为执行程序指令,引入数据,装载数据等等,都是需要内存空间的,内存空间也是有限的。 正常的程序执行,肯定是开辟内存空间,运行程序指令(输入、输出),程序结束,释放空间。这样可以保证内存的往复利用。

但是,有时候程序设计有漏洞或是不够严谨的话,导致占用的内存没有得到释放,那么这一块内存就没办法再利用了,这就是内存泄露。

当不断出现内存泄露的时候,被占用的内存空间越来越多,最终到下一次需要使用内存空间的时候就会这样——空间不够了,溢出了。

Java的内存溢出


对于Java,内存溢出分三种情况。

1、OutOfMemoryError: PermGen space

Permanent Generation space 这个区域主要用来保存加来的Class的一些信息,在程序运行期间属于永久占用的,Java的GC不会对他进行释放,所以如果启动的程序加载的信息比较大,超出了这个空间的大小,就会发生溢出错误;

解决的办法无非就是增加空间分配了——增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。

2、OutOfMemoryError:Java heap space

heap 是Java内存中的堆区,主要用来存放对象,当对象太多超出了空间大小,GC又来不及释放的时候,就会发生溢出错误。

Java中对象的创建是可控的,但是对象的回收是由GC自动的,一般来说,当已存在对象没有引用(即不可达)的时候,GC就会定时的来回收对象,释放空间。但是因为程序的设计问题,导致对象可达但是又没有用(即前文提到的内存泄露),当这种情况越来越多的时候,问题就来了。

针对这个问题,我们需要做一下两点: 1、检查程序,减少大量重复创建对象的死循环,减少内存泄露。 2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。

3、StackOverFlowError

stack是Java内存中的栈空间,主要用来存放方法中的变量,参数等临时性的数据的,发生溢出一般是因为分配空间太小,或是执行的方法递归层数太多创建了占用了太多栈帧导致溢出。

针对这个问题,除了修改配置参数-Xss参数增加线程栈大小之外,优化程序是尤其重要。

作者:艾尔欧唯伊 链接:https://www.jianshu.com/p/8c31ef19983a 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值