【问题标题】:Looking for allocation of JVM heap寻找 JVM 堆的分配
【发布时间】:2021-07-28 14:24:26
【问题描述】:

我已经运行了 straced JVM (OpendJDK 11):

strace -e trace=mmap java -Xms8192m Main

输出是:

mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7effda5fa000
mmap(NULL, 2158880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effda1c3000
mmap(0x7effda3d1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7effda3d1000
mmap(NULL, 246024, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7effda5bd000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd9dd2000
mmap(0x7effda1b9000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7effda1b9000
mmap(0x7effda1bf000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7effda1bf000
mmap(NULL, 2212016, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd9bb5000
mmap(0x7effd9dd0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0x7effd9dd0000
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd99b1000
mmap(0x7effd9bb3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7effd9bb3000
mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd9792000
mmap(0x7effd99ab000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7effd99ab000
mmap(0x7effd99ad000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7effd99ad000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7effda5bb000
mmap(NULL, 21206808, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd8358000
mmap(0x7effd963f000, 1032192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10e7000) = 0x7effd963f000
mmap(0x7effd973b000, 354072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7effd973b000
mmap(NULL, 246024, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7effda5bd000
mmap(NULL, 3702848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd7fcf000
mmap(0x7effd8348000, 49152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x179000) = 0x7effd8348000
mmap(0x7effd8354000, 12352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7effd8354000
mmap(NULL, 3789144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd7c31000
mmap(0x7effd7fcd000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19c000) = 0x7effd7fcd000
mmap(NULL, 2192432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd7a19000
mmap(0x7effd7c2f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7effd7c2f000
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7effda4ba000
+++ exited with 0 +++

我将堆的初始大小设置为 8192M,并尝试在 strace 的输出中找到堆的分配。我找不到。为什么?

【问题讨论】:

    标签: jvm strace


    【解决方案1】:

    添加-f 选项(跟踪子进程)。

    在原始线程中运行 Java 代码会导致很多问题,有关详细信息,请参阅 JDK-6316197

    java 启动器在新线程中创建 JVM。

    【讨论】:

    • 谢谢,它有帮助。 @apangin,你知道我在哪里可以读到 JVM 对堆的内部表示(管理)吗?
    • @Gilgamesz 这个问题太笼统了。我只能在互联网上给出同样广泛的答案。
    • 好吧,我不是指垃圾收集(以及年轻/终身代、元空间等)。我的意思是 JVM 如何保持堆(例如,作为空闲列表)。我想了解它。这对我来说很有趣。无论如何,谢谢你的时间:)
    • @Gilgamesz 在 HotSpot 源中查找 collectedHeap。不过,每个 GC 都有自己的collectedHeap 实现。
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多