У меня есть очень простая программка, которая показана нижеОгромного потребления памяти нитей
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 мб для eden (ЕС). Когда основной поток запущен, и я снова jstat, он показывает около 3000 мб! Какая причина для большой кучи? Я уже сделал heapdump, и источником кучи-отходов являются множество массивов int [] и char []. Они не привязаны, поэтому я не могу их отслеживать.
EDIT: Я думаю, что эти темы связаны: http://stackoverflow.com/questions/17145228/track-down-allocations-of-int и http://stackoverflow.com/questions/7304665/ objects-with-no-references-in-hprof – Jens