【发布时间】:2017-05-31 12:32:06
【问题描述】:
JDK版本是热点8u_45
我研究了我的 java 进程的本机内存。本机内存甚至比堆消耗更多的空间。然而,有许多本机内存块让我感到困惑。 pmap -x 的结果例如:
00007f8128000000 65508 25204 25204 rw--- [ anon ]
00007f812bff9000 28 0 0 ----- [ anon ]
00007f812c000000 65508 24768 24768 rw--- [ anon ]
00007f812fff9000 28 0 0 ----- [ anon ]
00007f8130000000 65508 25532 25532 rw--- [ anon ]
00007f8133ff9000 28 0 0 ----- [ anon ]
00007f8134000000 65524 22764 22764 rw--- [ anon ]
00007f8137ffd000 12 0 0 ----- [ anon ]
00007f8138000000 65508 26456 26456 rw--- [ anon ]
00007f813bff9000 28 0 0 ----- [ anon ]
00007f813c000000 65508 23572 23572 rw--- [ anon ]
00007f813fff9000 28 0 0 ----- [ anon ]
00007f8140000000 65520 23208 23208 rw--- [ anon ]
00007f8143ffc000 16 0 0 ----- [ anon ]
00007f8144000000 65512 23164 23164 rw--- [ anon ]
00007f8147ffa000 24 0 0 ----- [ anon ]
00007f8148000000 65516 23416 23416 rw--- [ anon ]
00007f814bffb000 20 0 0 ----- [ anon ]
00007f814c000000 65508 23404 23404 rw--- [ anon ]
00007f814fff9000 28 0 0 ----- [ anon ]
00007f8150000000 65512 24620 24620 rw--- [ anon ]
00007f8153ffa000 24 0 0 ----- [ anon ]
00007f8154000000 65536 23976 23976 rw--- [ anon ]
00007f8158000000 65508 23652 23652 rw--- [ anon ]
00007f815bff9000 28 0 0 ----- [ anon ]
00007f815c000000 65508 23164 23164 rw--- [ anon ]
00007f815fff9000 28 0 0 ----- [ anon ]
00007f8160000000 65508 23344 23344 rw--- [ anon ]
00007f8163ff9000 28 0 0 ----- [ anon ]
00007f8164000000 65508 24052 24052 rw--- [ anon ]
00007f8167ff9000 28 0 0 ----- [ anon ]
00007f8168000000 131052 48608 48608 rw--- [ anon ]
00007f816fffb000 20 0 0 ----- [ anon ]
00007f8170000000 65516 23056 23056 rw--- [ anon ]
00007f8173ffb000 20 0 0 ----- [ anon ]
00007f8174000000 65516 26860 26860 rw--- [ anon ]
00007f8177ffb000 20 0 0 ----- [ anon ]
00007f8178000000 65508 23360 23360 rw--- [ anon ]
00007f817bff9000 28 0 0 ----- [ anon ]
00007f817c000000 65536 24856 24856 rw--- [ anon ]
00007f8180000000 65512 23272 23272 rw--- [ anon ]
00007f8183ffa000 24 0 0 ----- [ anon ]
00007f8184000000 65508 23688 23688 rw--- [ anon ]
00007f8187ff9000 28 0 0 ----- [ anon ]
00007f8188000000 65512 24024 24024 rw--- [ anon ]
00007f818bffa000 24 0 0 ----- [ anon ]
00007f818c000000 65508 25020 25020 rw--- [ anon ]
00007f818fff9000 28 0 0 ----- [ anon ]
00007f8190000000 65512 22868 22868 rw--- [ anon ]
00007f8193ffa000 24 0 0 ----- [ anon ]
00007f8194000000 65508 24156 24156 rw--- [ anon ]
00007f8197ff9000 28 0 0 ----- [ anon ]
00007f8198000000 65508 23684 23684 rw--- [ anon ]
有很多块,大约占64M。
我使用 jcmd pid VM.native_memory detail 来跟踪这些内存块。但是,我找不到这些具有 jcmd 结果中列出的任何内存范围的块。
此外,我注意到一篇文章提到了 glic Java 8 and Virtual Memory on Linux 的 malloc 中的竞技场效果。但是这些块似乎与线程池不同,因为 1. 模式是 rw--- 而不是 ----- 2. arena 线程池只影响虚拟内存。 RSS 无法解释这些太多。
我使用 gdb 来跟踪分配的内存
dump binary memory mem.bin from to
mem.bin.3
如图所示,大约有 30 个方块。
几天后,我使用 Google perf 工具来跟踪堆分配。并发现了这个:
说明:zip inflates 消耗近2G内存。我猜它可能与一些编译问题有关。
我看过这个问题:https://bugs.openjdk.java.net/browse/JDK-8164293。这与我的担忧有关吗?
那么如何追踪这些内存块的来源呢?
【问题讨论】:
-
这是一个什么样的Java进程?你在做任何互操作吗?
-
@JornVernee 这个进程是thrift和jetty的互操作进程
-
我的意思是原生互操作。我的想法是在 VM 之外分配的内存不会通过
jcmd显示,但会显示为pmap。 -
@JornVernee 抱歉,我不明白什么是本机互操作。能给我举个例子吗?
-
例如,当您从 Java 的本机
.so/.dll调用函数时。我不太了解这些库,但不能说他们是否这样做。
标签: java memory jvm java-native-interface pmap