3

我已经分析了一个简单的程序,如下所示,发现要创建大量的 char[] 实例。读到这里 char[] 实例通常归因于字符串,我看不出这个程序是怎么回事。我知道 Thread 类中有一个 char[] 'name' 变量,但肯定应该只创建其中的 10,000 个,所以我想知道额外的 35,000 个线程是从哪里来的?

public class untitled {
    public static void main(String args[]){
        ArrayList<Thread> a = new ArrayList<Thread>();
        for(int i = 0; i < 10000; i++){
            Thread t1 = new Thread();
            a.add(t1);
            t1.start();
        }
    }
}

这是分析内存结果的屏幕截图。似乎还有许多 String[] 实例。

在此处输入图像描述

我使用这个程序来隔离分析器的其他部分。在完整程序中,char[] 实例增加到 ~335,000

4

1 回答 1

0

您必须使用 heap walker 才能回答这个问题。char[]在堆遍历器的类视图中选择类并创建一个新的对象集。然后转到引用视图并从视图选择器中选择“累积传入引用”。

在此处输入图像描述

答案是大约三分之一的 char[] 对象属于由各种类在 JVM 中分配的字符串,而三分之二来自线程名称。

于 2013-07-24T08:01:46.363 回答