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

标签 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 内存,如果不调用 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/

相关文章:

java - 支持 JPA 的企业应用程序的 Spring 和 Hibernate 对业务有何帮助?

c++ - 动态 vector 的特征库内存使用

php - 在 PHP 中执行的 MySQL 查询导致非常大的 httpd 线程

javascript - 当被内存的功能接受功能时,Lodash 内存键?

javascript - JavaScript 压缩库使用什么技术来最小化文件大小?

mysql - 帮我优化一个属性太多的 ActiveRecord 对象

java - 将无状态 bean 注入(inject)单例 bean

java - 读取 CSV 文件并写入另一个 CSV - ArrayIndexOutOfBoundsException 和模式困难

android - Android Honeycomb 中的 Bitmap#recycle() 实际上做了什么?

java - jquery.js 没有在 Tomcat 中加载