为什么JVM使用全0的巨型int []?

时间:2016-08-26 19:03:39

标签: java jvm overhead

我知道JVM存在固有的开销,我想进一步研究以确切了解开销是什么。

使用YourKit探查器,我发现有巨大的int []充满了看似随机的信息。我的猜测是,这些存储了JVM用于优化应用程序的一些性能指标和其他内容;但令我惊讶的是,所有元素都是值0

为了获得我的结果,我使用了以下“无所事事”程序,因此结果只包含JVM上发生的事情。

public final class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(Long.MAX_VALUE);
    }

}

这是分析结果的屏幕截图,如有必要,我可以上传内存快照。

Screenshot from YourKit profiler

2 个答案:

答案 0 :(得分:1)

您可以通过检查这些阵列的传入链接来找到答案。只需右键单击可访问的数组,选择“所选对象”,然后切换到“传入引用”。

我发现sun.util.calendar.ZoneInfosun.util.Calendar.BaseCalendarjava.util.Currency等表中有表格。

很难确定,但最有可能的是,JVM使用那些大型无法访问的未归零数组从.class-files加载Java字节代码。编译后JVM不需要它们,所以它们已经发布但尚未收集。

答案 1 :(得分:0)

我一直在玩这个,它肯定与堆大小有关。例如,如果我设置-Xmx5m -Xmx5m,则int数组分配消失。然而,如果我设置-Xmx5g -Xms5g,它会创建更大的数组。

enter image description here

我想知道他们用它们是什么。

从/ r / java获得帮助。

"最有可能的是,这些是线程本地分配缓冲区中的填充对象,它们有助于堆解析:https://shipilev.net/jvm-anatomy-park/5-tlabs-and-heap-parsability/ 它们应该是无法访问的,并通过解析堆转储的工具进行过滤。在您的屏幕截图中,探查器显示"所有对象(可访问且无法访问)"。"