java中的内存使用大数组之谜

java中的内存使用大数组之谜,java,arrays,memory,Java,Arrays,Memory,我想测试java中一个类(foo)占用了多少内存。在foo的构造函数中,我有以下新内容: int 1 = new int[size] int 2 = new int[size] .... int 6 = new int[size] 大小从100开始,一直增加到4000。 所以我的代码是: Runtime r = Runtime.getRuntime(); for(int i=0;i<10;i++) r.gc(); double before = r.TotalMemory()-r.f

我想测试java中一个类(foo)占用了多少内存。在foo的构造函数中,我有以下新内容:

int 1 = new int[size]
int 2 = new int[size]
....
int 6 = new int[size]
大小从100开始,一直增加到4000。
所以我的代码是:

Runtime r  = Runtime.getRuntime();
for(int i=0;i<10;i++)
r.gc();

double before = r.TotalMemory()-r.freeMemory();
Foo f = new Foo();
double after = r.TotalMemory()-r.freeMemory();
double result = after-before;
Runtime r=Runtime.getRuntime();

对于(int i=0;i垃圾收集器是聪明的野兽。它们不需要每次都收集所有东西。它们可以推迟将东西混在一起。你可以阅读

如果你想知道你的类占用了多少内存,何必费心通过请求垃圾收集来引入不受污染。抓住依次增大的对象,检查你的应用程序有多大。看看大小的增量

List myListOfBigObjects

for ( for sizes up to 100 or more ) {

    make an object of current size
    put it in the list

    now how big are we?
}

或者你可以说“一个int是那么多字节,我们有nx那么多字节”对于一个对象来说,有一些固定的开销,但是仅仅增加数组大小肯定会增加一个可预测的数量。所有这些“我需要知道对象需要多少内存”问题通常是过早优化的症状

如果您过早地进行了优化(我也这么认为),请停止您现在正在做的事情,回到您真正应该做的事情:完成您当前正在开发的应用程序(我的另一个假设)


如果您没有过早地进行优化,您可能仍然需要立即停止并开始使用探查器,该探查器将告诉您哪些对象实际使用内存。只有这样,您才能开始减少对象的内存需求或检查忘记从某个集合中删除的对象。

您使用的是什么语言/平台?I基于getRuntime()将其标记为Java-如果这是错误的,请随意更正。奇怪?您确实知道3.1819152E7是31819152,即约31 MB?如果其Java,则应为r.totalMemory()要编译,实际上我正在尝试优化,我想学习…我已经完成了我的应用程序,我正在尝试进行一些测量。Alex,然后使用探查器。所有这些都会影响运行时。free/total/maxMemory()垃圾收集器不会帮你什么忙。老实说,不要这样做。如果我没有来自“上面”的压力在图表中显示结果等,我会这样做的。我希望理解:)任何像样的分析器,比如visualvm,都会给你很多漂亮的图表。