我有一个非常基本的程序,如下所示
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 []数组。它们没有被引用,所以我无法跟踪它们。答案 0 :(得分:0)
堆的大小由jvm决定,它跟踪分配的内存和分配频率(以及更多的东西)并使用一些复杂的方法来计算它。传递的参数被视为建议而不是配置,所以jvm可能会选择忽略-Xms14000m -XX:NewSize=10000m
。
您不能指望堆大小恰好是由您的变量组成的特定数字。
我没有看到&#34;内存泄漏&#34;在你提供的代码中,这是整个事情吗?
另外我建议您使用Java Visual VM来跟踪内存消耗,它位于jdk bin文件夹中。