给出以下代码来测试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
意味着大量内存使用,对吧?有什么解释吗?
答案 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