本文主要是介绍g1垃圾回收算法遇到的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
线上环境给jvm分配了16g的空间,大概在10g左右触发了Java heap space,频繁的Allocation failure。感觉很奇怪,明明还剩下差不多6g的空间,怎么用不上? 系统主要是对接各oss平台,处理文件上传的。怀疑是不是有大文件?检查了一遍发现并没有。
分析了下代码,对于大文件使用的是分块上传,每个块10M。之前有个bug就是在文件上传过程中,这10M的内存是不能释放的,这个跟当前问题有关但还不是重点。明明还剩这么多空间,为啥不能分配?因为有很多文件上传,所以达到1000个块是可以预料的。
猜想:
一个10MB的对象占用了2个region 构成的Humongous区域 (一个region 8M = 16g/2048),剩下的6MB不能被使用。这也正好解释了,为啥16G 内存,使用10G就报内存不够用了。但是这个比较难验证。有谁知道结论或者知道怎么验证的,分享下吧。
这篇关于g1垃圾回收算法遇到的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!