我是java内存问题的新手,在调试java进程的内存使用时遇到问题,需要你的帮助。 按照" top",java进程占用8G的Resident内存和9.4G的虚拟内存。这对于这个过程来说太过分了,我想检查它为什么会吞噬记忆。所以我使用jmap进行堆转储(没有' live'选项,因为它可能触发GC)并且发现只有100MB的活动对象存在并且有1.5G的无法访问的对象。那剩下的6G内存在哪里呢?我应该检查哪些其他类型的非堆内存?另外,你能帮我找到任何工具/ unix命令吗?
JVM args:-Xms为2G,-Xmx为8G
如果我在此处添加更多信息,请告知我们,以便为您提供更多背景信息。
先谢谢。
答案 0 :(得分:1)
在Linux上,这可能会提供一些有用的信息:
pmap -x PID
有关man pmap
pmap
你还应该知道Linux上有一个已知的问题,glibc> = 2.10(Ubuntu> = 10.04,RHEL> = 6)导致"内存丢失"。
治愈就是设定
export MALLOC_ARENA_MAX=4
在Google或StackOverflow上搜索MALLOC_ARENA_MAX以获取更多相关信息。
您可能还想调整其他malloc选项以优化分配内存的低碎片:
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536
答案 1 :(得分:0)
你告诉Java它可能需要8Gb而且确实如此。也许你将JVM内部的内存使用量增加到8Gb一会儿;然后它收集了垃圾并丢弃了价值6.4Gb的无法访问的对象。但是JVM并没有将该内存返回给系统。
但是,当您的计算机上的物理内存不足时,这些6.4Gb未使用的页面将被换出。你的机器还没有内存不足,所以它们仍然是RSS的一部分。至少,这是我有根据的猜测。