内存使用大型数组拼图在java中

时间:2009-08-19 10:55:50

标签: 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.freeMemory();
Foo f = new Foo();
double after = r.TotalMemory()-r.freeMemory();
double result = after-before;

问题是unti 2000我有一个越来越好的结果。但是在2000之后我有一个数字是&lt; 2000年的结果。我猜gc是被触发的。有时我得到相同的数字,因为它没有看到差异。
我确实运行-Xms2024m -Xmx2024m,这是我的完整的PC内存。但是我得到了同样的行为。
我确实使用-Xmn2023m -Xmx2024m运行了,我得到了一些奇怪的结果,例如:3.1819152E7。

请帮助我。谢谢。

2 个答案:

答案 0 :(得分:6)

所有这些“我需要知道A所占用的内存对象”问题通常是过早优化的症状。

如果您过早地进行优化(我假设那么多)请立即停止您正在做的 并回到您应该做的事情:完成您目前正在工作的应用程序(我的另一个假设)。

如果您没有过早优化,您可能仍需要立即停止并开始使用分析器来告诉您实际上使用内存的对象。只有然后才能开始减少对象的内存需求或检查您忘记从某个集合中删除的对象。

答案 1 :(得分:1)

垃圾收集者是聪明的野兽。他们不需要每次都收集所有东西。他们可以推迟洗牌。你可以阅读Generational Gabage Collection

如果你想知道你的课程有多少内存,为什么还要通过索取垃圾收集来介绍不确定性。抓住相继较大的对象并检查应用程序的大小。查看大小的增量。

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那么多字节”对象有一些不变的开销,但只是增加数组大小肯定会使对象增加一个可预测的数量。