我似乎遇到了一个问题,即我的Java Process的内存(私有工作集)继续超越指定的-Xmx值。
据我所知,每个进程都有几组内存,JVM堆只是其中之一。
虽然,我似乎无法找到内存堆积的来源。 我用VisuamVM监视了我的应用程序,发现JVM堆不是问题。
值得注意的是,我的应用程序确实通过DirectByteBuffers使用堆外内存,我们通过使用以下方式处理这些缓冲区:
((DirectBuffer) buffer).cleaner().clean();
值得注意的是,我们正在使用第三方Native dll Libraries进行DirectX渲染。
-Xmx384m -Xss2m -Dsun.java2d.noddraw=true -XX:CompileThreshold=1500 -Xincgc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
请注意,由于缺少Stack Overflow信誉,某些网址未嵌入。
#1 - MXBeans
来源:http://middlewaremagic.com/weblogic/?p=898
#2 - 原生内存跟踪
来源:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
#3 - VisualVM
记忆 - >堆: http://i.imgur.com/XNn2G4I.png
记忆 - >元空间: http://i.imgur.com/6Zfn9xp.png
记忆 - >私人工作集: http://i.imgur.com/Yus8wti.png
尽管进行了所有这些监控,我仍然无法找到内存分配的来源。我错过了什么,我读错了数据吗?如果在本机堆上分配内存,我该如何跟踪并监视它?
如果您需要任何其他信息,我们乐意提供。感谢您抽出宝贵时间帮助我解决这个问题!