我有一个应用程序进行大量字符串操作,我注意到 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”进程。
显然,我正在做很多临时字符串副本,但我希望一旦我丢失了引用,它们会被 carbage 收集器释放。
编辑:也许不相关,但我尝试使用 32 位和 64 位版本的 java 1.6。