我有一个应用程序需要进行大量的字符串操作,但是我发现即使没有将任何东西存储在内存中,jvm的内存使用率也非常高。
我制作了一个简单的示例应用程序来演示这个问题: 我有一个简单的JFrame窗口,里面只有一个按钮。
private void buttonDoWorkActionPerformed(java.awt.event.ActionEvent evt) {
String randomString = "abc test garbagecollector";
ArrayList<String> results;
for(int i=0; i<100000; i++)
results = doNothing(randomString.split(" "));
results = null;//No effect
System.gc();//No effect
}
private static ArrayList<String> doNothing(String[] words) {
ArrayList<String> results = new ArrayList<String>();
for (String word : words)
results.add(word);
return results;
}
如果您运行此示例,则JVM将占用约50Mo的内存,在单击按钮后,它将升至150Mo并永远不会降下来。 编辑:我指的是Windows任务管理器中的“java.exe”进程。
显然,我正在做很多临时字符串副本,但我希望一旦失去引用,它们将被垃圾收集器释放。
编辑:也许与此无关,但我尝试过使用Java 1.6的32位和64位版本。