内存使用情况在我的程序中没有变化

时间:2015-01-29 17:32:21

标签: java memory garbage-collection

给出以下代码来测试Java程序的内存使用情况:

List<Person> list = new ArrayList<Person>();
for (int i = 0; i <= 10000000; i++) {
  list.add(new Person("Jim", "Knopf"));
}
// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);

无论我如何更改286046的值,输出始终为i。但是大i意味着大量内存使用,对吧?有什么解释吗?

2 个答案:

答案 0 :(得分:3)

  

无论我如何更改i的值,输出始终为286046。但是大的我意味着大量的内存使用,对吧?有什么解释吗?

gc()list已超出范围(即不再使用)且未保留。尝试将其放在static中,因为这不能丢弃。

注意:如果使用-XX:-UseTLAB,将获得更准确的内存记帐,因为这会禁用并发内存分配,从而简化会计。

答案 1 :(得分:1)

来自javadoc

  

返回Java虚拟机中的可用内存量。调用   gc方法可能会导致增加返回的值   freeMemory。

我的猜测是,因为内存是使用大块分配的,所以它总是返回相同,因为你保持低内存使用率。尝试做更高的测试,不要忘记给垃圾收集器System.gc();打电话,让你的测试更有吸引力。

选中此http://www.tutorialspoint.com/java/lang/runtime_freememory.htm

我还会尝试将最小内存-Xms设置得非常低,这样您就有更多机会溢出最小值并强制JVM分配更多内容并减少freememory