十一:堆外内存导致的溢出错误

问题导入:

某项目运行在内存4GB的32位Windows机器上,运行Jetty服务器,划分了1.6GBA给堆内存,但是依旧不时会抛出内存溢出异常

 

原因:

操作系统对每个进程能管理的内存是有限制的,这台服务器使用的32 位 Windows平台的限制是2GB,其中划了16GB给Java堆,而 Direct Memory内存并不算入1.6GB的堆之内,因此它最大也只能在剩余的0.4GB空间中分出一部分。在此应用中导致溢出的关键是:垃圾收集进行时,虚拟机虽然会对 Direct Memory进行回收,但是 Direct Memory却不能像新生代、老年代那样,发现空间不足了就通知收集器进行垃圾回收,它 只能等待老年代满了后FuGC,然后“顺便地”帮它清理掉内存的废弃对象。

否则它只能一直等到抛出内存溢出异常时,先 catch掉,再在catch块里面“大喊”一声:“ System gc()!”。要是虚拟机还是不听(譬如打开了XX:+ DisableExplicitGC开关),那就只能眼睁睁地看着堆中还有许多空闲内存,自已却不得不抛出内存溢出异常了。而本案例中使用的CometD框架正好有大量的NIO操作需要使用到堆外直接内存(Direct Memory)

 

附加:

除了堆内存外,还会占用较大内存的区域有:

 

全部评论

相关推荐

争当牛马还争不上
码农索隆:1.把简历改哈 2.猛投,狠投 3.把基础打牢 这样你在有机会的时候,才能抓住
点赞 评论 收藏
分享
明天不下雨了:让我们大声的说出来:以前的未来就是现在
点赞 评论 收藏
分享
05-29 20:34
门头沟学院 C++
KarlAllen:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
无实习如何秋招上岸
点赞 评论 收藏
分享
昨天 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务