内存的溢出

内存的溢出有以下几种情况:

1.堆栈溢出:

  当看到heap相关的时候就肯定是堆栈溢出了,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过一定是代码没有问题的前提下。
关键字: java.lang.OutOfMemoryError:…java heap space…
原因: 要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,所以不会去回收。

2.PermGen溢出

关键字: java.lang.OutOfMemoryError:PermGen space
原因: 系统的代码非常多或者引用的第三方包非常多、或者代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀。
解决方法: 增加-XX:PermSize和-XX:MaxPermSize的大小。

3.在使用ByteBuffer中的allocateDirect()的时候会用到,很多javaNIO的框架中被封装为其他的方法

关键字: java.lang.OutOfMemoryError :Direct buffer memory
原因: 如果在直接或间接使用了ByteBuffer中的allocateDirect方法的时候,而不做clear的时候就会出现类似的问题,常规的引用程序IO输出存在一个内核态与用户态的转换过程,也就是对应直接内存与非直接内存,如果常规的应用程序你要将一个文件的内容输出到客户端需要通过OS的直接内存转换拷贝到程序的非直接内存(也就是heap中),然后再输出到直接内存由操作系统发送出去,而直接内存就是由OS和应用程序共同管理的,而非直接内存可以直接由应用程序自己控制的内存,jvm垃圾回收不会回收掉直接内存这部分的内存。
解决方法: 可以考虑设置参数:-XX:MaxDirectMemorySize

4.

关键字: java.lang.StackOverflowError
原因: 可能是-Xss设置的太小
解决方法: 对系统做一些优化,使得-Xss的值是可用的

5.

关键字: java.lang.OutOfMemoryError:unable to create new native thread
原因: 上面第四种溢出错误,已经说明了线程的内存空间,其实线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外的区域,无法为线程分配一块内存区域了,这个要么是内存本身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了。
解决方法: 适当牺牲性能,优化代码里面的线程池的线程配置;减少JVMMemory的分配。

6.

关键字: java.lang.OutOfMemoryError:request{}byte for{}out of swap
原因: 这类错误一般是由于地址空间不够导致的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值