内存使用在我的程序中没有改变

Memory usage does not change in my program

给出以下测试 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);

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

来自 javadoc

Returns the amount of free memory in the Java Virtual Machine. Calling the gc method may result in increasing the value returned by freeMemory.

我的猜测是,由于内存是使用大块分配的,因此它总是 return 相同,因为您的内存使用率较低。尝试做一个更高的测试,不要忘记调用垃圾收集器 System.gc(); 让你的测试更相关。

勾选这个http://www.tutorialspoint.com/java/lang/runtime_freememory.htm

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

The output is always 286046, no matter how I change the value of i. But large i means large memory usage, right? Any explanation?

当您 gc() 时,list 已超出范围(即不再使用)并且不会保留。尝试将它放在 static 中,因为它不能被丢弃。

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