Java 试图找到漏洞!anon对pmap意味着什么?
我试图找到在linux中运行的java进程的内存去向。有人建议我使用pmap-x来查看内存到底在做什么 输出非常长,但基本上大部分是重复的:Java 试图找到漏洞!anon对pmap意味着什么?,java,linux,memory,memory-management,pmap,Java,Linux,Memory,Memory Management,Pmap,我试图找到在linux中运行的java进程的内存去向。有人建议我使用pmap-x来查看内存到底在做什么 输出非常长,但基本上大部分是重复的: 00007fbf75f6a000 1016 - - - rwx-- [ anon ] 00007fbf76068000 12 - - - ----- [ anon ] 这到底意味着什么?为什么我有这么多(4000+)项?请参阅匿名内存的系统性能调整。Ano
00007fbf75f6a000 1016 - - - rwx-- [ anon ]
00007fbf76068000 12 - - - ----- [ anon ]
这到底意味着什么?为什么我有这么多(4000+)项?请参阅匿名内存的系统性能调整。Anon块是通过malloc或mmap分配的“大”块--请参阅手册页。因此,它们与Java堆无关(除了整个堆应该存储在这样一个块中这一事实)
根据我的经验,线程堆栈也使用anon块。如果您看到许多anon块都具有相同的大小,并且大小为512k到4Mb(下面的示例在我运行的Tomcat进程中重复了十几次),这就是可能的原因。根据课程的不同,你可能会有几十个这样的课程;如果你看到成千上万的人,这意味着你在线程方面有问题
b089f000 504K rwx-- [ anon ]
b091d000 12K ----- [ anon ]
b0920000 504K rwx-- [ anon ]
b099e000 12K ----- [ anon ]
b09a1000 504K rwx-- [ anon ]
b0a1f000 12K ----- [ anon ]
但这留下了一个问题:为什么要使用pmap来诊断Java内存问题 使用EclipseMat(当您从Java堆而不是本机堆中获得OfMemoryException时)。我以前在线程泄漏中见过这种模式。如果您的代码试图汇集线程,但不知何故弄乱并泄漏了一个线程,那么您会在pmap中得到类似的模式 我认为每一位内存都是线程的最小堆栈大小,当然在我们的例子中它与堆无关。
当我们达到操作系统的限制时,仍然会出现内存错误,即使在分析堆时,它并没有被过度分配
当我们遇到这样的问题时,pmap[pid]| grep-c 12K被证明是正在使用的线程数。告诉您如何管理匿名分配,而不是它是什么。虽然链接整体上很好。>为什么要使用pmap诊断Java内存问题?我们有一个java进程,堆设置为最大256MB,但它的RSS内存是8.9GB。我们还能用什么工具来诊断呢?@Opher-当然,对你来说是有意义的。但你是那个人吗?(如果是的话,你为什么在8年后发表评论?)。从最初的问题来看,不清楚OP是否知道他/她在寻找什么。作为建议:如果您看到配置的堆大小和RSS之间存在如此大的差异,请查找内存映射文件或直接缓冲区。例如,您将在Kafka或SOLR服务器上看到这种行为,这是正常的。