我正在运行 JVM 1.5.0(Mac OS X 默认),并且我正在活动监视器中监视我的 Java 程序。我有以下内容:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
public class MemoryTest {
public static void memoryUsage() {
System.out.println(
Runtime.getRuntime().totalMemory() -
Runtime.getRuntime().freeMemory()
);
}
public static void main( String[] args ) throws IOException {
/* create a list */
ArrayList<Date> list = new ArrayList<Date>();
/* fill it with lots of data */
for ( int i = 0; i < 5000000; i++ ) {
list.add( new Date() );
} // systems shows ~164 MB of physical being used
/* clear it */
memoryUsage(); // about 154 MB
list.clear();
list = null;
System.gc();
memoryUsage(); // about 151 KB, garbage collector worked
// system still shows 164 MB of physical being used.
System.out.println("Press enter to end...");
BufferedReader br = new BufferedReader(
new InputStreamReader( System.in )
);
br.readLine();
}
}
那么,为什么即使垃圾收集器看起来工作得很好,物理内存也没有被释放呢?
许多 JVM 永远不会将内存返回给操作系统。是否这样做是特定于实现的。对于那些不这样做的人来说,启动时指定的内存限制(通常通过 -Xmx 标志)是为其他应用程序保留内存的主要方法。
我很难找到关于这个主题的文档,但是Sun Java 5 的垃圾收集器文档 http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html确实解决了这个问题,表明在正确的条件下,如果使用正确的收集器,堆将会收缩——默认情况下,如果超过 70% 的堆是空闲的,它就会收缩,这样只有 40% 是空闲的。控制这些的命令行选项是-XX:MinHeapFreeRatio
and -XX:MaxHeapFreeRatio
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)