为什么我的Java进程在内存(私有工作集)中继续增长

时间:2015-08-28 02:08:31

标签: java c++ memory jvm native

摘要

我似乎遇到了一个问题,即我的Java Process的内存(私有工作集)继续超越指定的-Xmx值。

据我所知,每个进程都有几组内存,JVM堆只是其中之一。

虽然,我似乎无法找到内存堆积的来源。 我用VisuamVM监视了我的应用程序,发现JVM堆不是问题。

值得注意的是,我的应用程序确实通过DirectByteBuffers使用堆外内存,我们通过使用以下方式处理这些缓冲区:

((DirectBuffer) buffer).cleaner().clean();

值得注意的是,我们正在使用第三方Native dll Libraries进行DirectX渲染。

JVM标志

-Xmx384m -Xss2m -Dsun.java2d.noddraw=true -XX:CompileThreshold=1500 -Xincgc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

监控

  • 之前=过度积累前的记忆。
  • After =积累过多后的记忆。

请注意,由于缺少Stack Overflow信誉,某些网址未嵌入。

#1 - MXBeans

  

来源http://middlewaremagic.com/weblogic/?p=898

     

之前http://pastebin.com/EgeciZ0w

     

之后http://pastebin.com/fraWDwiw

#2 - 原生内存跟踪

  

来源https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html

     

之前http://pastebin.com/qbzZAY6m

     

之后http://pastebin.com/LNNu4kRj

#3 - VisualVM

  

记忆 - >堆: http://i.imgur.com/XNn2G4I.png

     

记忆 - >元空间: http://i.imgur.com/6Zfn9xp.png

     

记忆 - >私人工作集: http://i.imgur.com/Yus8wti.png

结论

尽管进行了所有这些监控,我仍然无法找到内存分配的来源。我错过了什么,我读错了数据吗?如果在本机堆上分配内存,我该如何跟踪并监视它?

如果您需要任何其他信息,我们乐意提供。感谢您抽出宝贵时间帮助我解决这个问题!

0 个答案:

没有答案