Java JVM监视器字符数组内存使用情况

Java JVM监视器字符数组内存使用情况,java,jvm,monitor,Java,Jvm,Monitor,我正在为我的类创建一个4096 x 4096数组。当我分析时,它显示大部分内存被char数组使用。我的类中没有任何字符数组或字符串 这是我的Java类: public class MyClass { private int id; private boolean flag; public MyClass() { id = 0; flag = false; } } 我的主要课程是: public class Main {

我正在为我的类创建一个4096 x 4096数组。当我分析时,它显示大部分内存被char数组使用。我的类中没有任何字符数组或字符串

这是我的Java类:

public class MyClass {
    private int id;
    private boolean flag;


    public MyClass() {
        id = 0;
        flag = false;
    }
}
我的主要课程是:

public class Main {

    public static void main(String[] args) {
        MyClass[][] objects = new MyClass[4096][4096];

        for (int i = 0;i<4096;i++) {
            for(int j = 0;j<4096;j++) {
                objects[i][j] = new MyClass();
            }
        }

        while(true);
    }
}
公共类主{
公共静态void main(字符串[]args){
MyClass[][]对象=新的MyClass[4096][4096];

对于(int i=0;i在进行堆转储之前,请确保运行System.gc()或类似程序。否则,您将看到许多在示例中不再引用的对象。

从您的图像中,您创建的
MyClass
的实例在您进行分析时甚至都不存在。
char[]
使用是预期的,因为char数组返回
String
s,这在类定义等中被广泛使用

可能是因为您的阵列未被使用而被垃圾收集。请尝试在睡眠后添加使用该阵列的行,然后再次尝试分析。示例:

    MyClass[][] objects = new MyClass[4096][4096];
    for(int i = 0;i<4096;i++)
    {
        for(int j = 0;j<4096;j++)
        {
            objects[i][j] = new MyClass();

        }
    }

    Thread.sleep(1000000);
    System.out.println(objects[10][40]);
MyClass[]objects=newmyclass[4096][4096];

对于(int i=0;i)您是如何执行堆转储的?您是否预先运行了GC以清除所有垃圾?您的主要方法是从哪个类运行的?我更新了我的代码。这是我的项目中唯一的代码。将while(true)替换为:System.GC():Thread.sleep(100000);和sample againThere没有变化:/Ah,我明白了。是的,这就是问题所在。@user3332774探查器需要一些内存才能运行,尤其是VisualVM在运行时会创建很多对象。