我目前正在制作一个应用程序,可以扫描文件夹并为每个文件创建歌曲。
[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 内存,如果不调用 GC,则消耗 400Mb。但是每次调用GC确实很慢。所以,我想知道是否有另一种方法来优化内存。
谢谢
最佳答案
一般来说,您应该永远调用System.gc()
。 GC 是一个复杂的软件组件,它知道自己何时工作以及每个周期释放多少内存。
此外,显式调用System.gc()
并不会真正调用GC。它只是礼貌地要求 GC 工作。它可以启动,但可以推迟请求。
这意味着,如果您不调用 GC,程序就会运行,直到 GC 确定它应该工作,然后释放它。所以,你的问题的答案是“不用担心内存。让 GC 在它认为该工作的时候去做它的工作。”
但是。仅当您没有可能发生内存泄漏时,所有这些才有意义,例如,如果您在长期存在的集合中存储一些不需要的信息。应以编程方式清除此类条目。
在 Java 中使用 GC 的“正确”方法是通过各种 -X
命令行开关。第一步只是尝试减少最大堆限制,例如-Xmx180m
。为什么是180?就因为你说调用GC的时候占用了150M。现在再试一次。如果程序运行良好并且性能现在更好,请尝试进一步减少内存。如果需要,请查看其他 GC 配置参数。
关于java - 如何在不调用System.gc()的情况下优化内存;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019986/