如何在不调用System.gc()的情况下优化内存;

时间:2014-07-29 16:10:12

标签: java memory optimization garbage-collection

我目前正在制作一个扫描文件夹并为每个文件创建歌曲的应用程序。

[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都非常慢。所以,我想知道是否有另一种方法来优化内存。

由于

2 个答案:

答案 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。