Java 线程的巨大内存消耗

Java 线程的巨大内存消耗,java,arrays,multithreading,memory-leaks,heap,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].jo

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

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();
    }
}
}
主要方法:
睡眠(10000);
MyThread[]线程=新的MyThread[16];

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

我在您提供的代码中没有看到“内存泄漏”,这就是全部原因吗


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

谢谢您的回复。我想我表达的堆大小是错误的。在所有线程开始之前:可用堆:14GB,在所有线程开始后使用堆:460MB(在Thread.sleep(3000000)):Ava.heap:14GB,Usedheap:3GB。我已经使用了visualVM(和eclipse MAT,以及JProfiler)。正如前面提到的,它们都显示了大int[]和char[]数组。我认为这些数组来自JVM,因为我创建的任何对象都没有对它们的引用。当我通过parseHeapDump.sh解析HeapDump时-keep_unreachable_对象(eclipse MAT)是的,这是整个代码编辑:我认为这些主题是相关的:和