我认为您已正确诊断:您永远不会用完Java堆,因此JVM不会进行垃圾回收,并且不会释放映射的缓冲区。手动运行GC时没有问题的事实似乎证实了这一点。您还可以打开详细的收集日志记录作为辅助确认。
所以,你可以做什么?好吧,我首先要尝试使用-
Xms命令行参数将初始JVM堆大小保持较小。如果您的程序不断在Java堆上分配少量内存,则可能会导致问题,因为它会更频繁地运行GC。
我还将使用 pmap
工具(或Windows上的任何等效工具)来检查虚拟内存映射。您可能会通过分配可变大小的缓冲区来碎片化C堆。如果真是这样,那么您会看到每张更大的虚拟地图,其中“
anon”块之间存在间隙。解决方案是分配大于所需大小的恒定大小的块。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)