java正在尝试查找漏洞!anon对pmap意味着什么?
我试图找到在linux中运行的java进程的内存去向。有人建议我使用pmap-x来查看内存到底在做什么
输出非常长,但基本上大部分是重复的:
00007fbf75f6a000 1016 - - - rwx-- [ anon ]
00007fbf76068000 12 - - - ----- [ anon ]
这到底意味着什么?为什么我有这么多(4000+)的条目
# 1 楼答案
Anon块是通过malloc或mmap分配的“大”块——请参阅手册页。因此,它们与Java堆无关(除了整个堆应该存储在这样一个块中这一事实)
根据我的经验,线程堆栈也使用anon块。如果您看到许多anon块都具有相同的大小,并且大小为512k到4Mb(下面的示例在我运行的Tomcat进程中重复了十几次),这就是可能的原因。根据课程的不同,你可能会有几十个这样的课程;如果你看到成千上万的人,这意味着你在线程方面有问题
但这留下了一个问题:为什么要使用pmap来诊断Java内存问题
# 2 楼答案
使用EclipseMat(当您从Java堆而不是本机堆中获取OfMemoryExceptions时)
# 3 楼答案
请参阅匿名内存系统性能调优的
this partthis part# 4 楼答案
我以前在螺纹泄漏中见过这种模式。如果您的代码试图汇集线程,但不知何故弄乱并泄漏了一个线程,那么您会在pmap中得到类似的模式
我认为每一位内存都是线程的最小堆栈大小,当然在我们的例子中,它与堆无关
当我们达到操作系统的限制时,仍然会出现内存错误,即使在分析堆时,它并没有被过度分配
当我们遇到这样的问题时
pmap [pid] | grep -c 12K
被证明是正在使用的线程数