线程的内存消耗很大

时间:2016-01-22 15:11:17

标签: java arrays multithreading memory-leaks heap

我有一个非常基本的程序,如下所示

Main-Method:

Thread.sleep(10000);

MyThread[] threads=new MyThread[16];

for(int i=0;i<16;i++){
    threads[i]=new MyThread();  
}

for(int i=0;i<16;i++){
    threads[i].start(); 
}

for(int i=0;i<16;i++){
    threads[i].join();  
}






Threadclass:

public class MyThread extends Thread{
byte[][] queue = new byte[125][];

public void run() {

    for(int i=0;i<125;i++){

    byte[] tempbyte=new byte[20];
    for(int i1=0;i1<20;i1++){
        tempbyte[i1]=(byte) 255;
    }
    queue[i]=tempbyte;
    }

    try {
        Thread.sleep(3000000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}

所以基本上每个线程创建125个20字节的数组。有16个线程,这应该是40.000字节(16 * 125 * 20)。 现在出现了问题: 当我使用以下VM参数启动此程序时:

-Xms14000m -XX:NewSize = 10000m

并运行

jcstat -gc #PID

然后它显示了大约460 MB的伊甸园(欧盟)。 当主线程已经启动并且我再次执行jstat时,它显示大约3000 mb !! 什么是大堆的原因?我已经做了一个堆转储,堆浪费的来源是很多int []和char []数组。它们没有被引用,所以我无法跟踪它们。

1 个答案:

答案 0 :(得分:0)

堆的大小由jvm决定,它跟踪分配的内存和分配频率(以及更多的东西)并使用一些复杂的方法来计算它。传递的参数被视为建议而不是配置,所以jvm可能会选择忽略-Xms14000m -XX:NewSize=10000m。 您不能指望堆大小恰好是由您的变量组成的特定数字。

我没有看到&#34;内存泄漏&#34;在你提供的代码中,这是整个事情吗?

另外我建议您使用Java Visual VM来跟踪内存消耗,它位于jdk bin文件夹中。