我目前正在制作一个扫描文件夹并为每个文件创建歌曲的应用程序。
[loop]
if(!alreadyInLibrary(folder.getAbsolutePath())){
Song s = new Song(folder.getAbsolutePath());
this.addSong(s); // Add the song
// Clear
s = null;
System.gc();
}
[end loop]
如果我打电话给GC,我的应用程序将耗尽150Mb的内存和400Mb的内存。但每次调用GC都非常慢。所以,我想知道是否有另一种方法来优化内存。
由于
答案 0 :(得分:1)
一般情况下,永远不会致电System.gc()
。 GC是一个复杂的软件组件,它知道自己何时工作以及每个周期可以释放多少内存。
此外,System.gc()
的显式调用并不真正调用GC。它只是礼貌地要求GC工作。它可以启动,但可以推迟请求。
这意味着如果您不调用GC,程序将运行,直到GC确定它应该工作然后释放它。所以,问题的答案是"只是不要担心内存。让GC在认为是工作的时候开始工作。"
但是。只有当您没有可能发生的内存泄漏时,所有这些都是相关的,例如,如果您在长期集合中存储一些不需要的信息。应以编程方式清除此类条目。
"对"在java中使用GC的方法是通过各种-X
命令行开关。第一步是尝试减少最大堆限制,例如-Xmx180m
。为何180?只是因为你说当你调用GC它占用150M。现在再试一次。如果程序运行良好且性能现在更好,请尝试进一步减少内存。如果需要,请查看其他GC配置参数。
答案 1 :(得分:0)
Song s = new Song(folder.getAbsolutePath());
this.addSong(new Song(folder.getAbsolutePath())); // Add the song
// Clear
s = null;
System.gc();
这是asinine。最有效的内存方式是:
this.addSong(new Song(folder.getAbsolutePath())); // Add the song
你从未使用过s。你刚刚创建它,然后将其设置为null,然后GC它。而是直接添加它。无需对此进行过早优化。
无需致电GC。它将在需要时运行。你通常不需要打电话给GC。