如何最小化我的应用程序使用的内存?

时间:2012-04-18 10:42:50

标签: java optimization memory-management

我正在写一个~30级的Java / Swing应用程序我的问题是当我运行我的程序时它加载超过 150 M 的内存,这是正常的吗?因为应用程序有4个线程,解析一些XML文件,加载一些图标文件,并投入一些Jfreechat图表。 如果不是我怎么做才能最大限度地减少应用程序使用的内存量,是否会影响某些变量为null帮助?正在加载XML文件一次,以便在所有应用程序生命周期帮助中使用它们,或者我必须在需要它们的时候加载它们吗?还有其他一些技巧可以帮助我吗?

PS:我可以使用8G内存计算机,以免影响我程序使用的内存。

编辑:似乎该程序没有占用所有150MB,因为我从linux上的top命令获得此值,方法是在我的应用程序中运行此代码vilmantas建议我:

   long free = Runtime.getRuntime().freeMemory();
   long total = Runtime.getRuntime().totalMemory();
   long max = Runtime.getRuntime().maxMemory();
   long used = total - free;

我发现他占用的比例少得多(约40MB)所以我决定使用“ - Xmx40M”参数运行它,并且我在Top命令中减少了超过40%的内存使用量。 自JVM (我知道)以来占用剩余内存的问题有自己的进程以及如何自动执行此操作**?**因为在选择时一个不合适的值你可以通过运行“ - Xmx30M”参数获得内存异常:

   Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space

4 个答案:

答案 0 :(得分:4)

是的。这是Java,通常您的VM / GC将为您完成工作。担心内存使用何时以及是否成为问题。
如果您愿意,有几种工具可以帮助您分析正在发生的事情。 How to monitor Java memory usage?

答案 1 :(得分:3)

如果引用变量的生命周期大于引用的实例,则将变量设置为null可以帮助防止内存泄漏。因此,应该在整个应用程序生命周期中保留的变量最好不要保留对短时间使用的临时对象的引用。

如果您只加载一次信息,那么只加载一次XML会有所帮助。这意味着,如果XML通过您的应用程序进行更改而您需要更新 - 您将不得不重新加载XML(如果不再需要弃用的XML信息,请将其删除)。

答案 2 :(得分:2)

您可以使用像http://www.eclipse.org/mat/这样的Java内存堆分析器来识别占用大部分内存的应用程序部分。然后,您可以优化数据结构,或通过将对数据的所有引用设置为null来决定数据的发布部分。

对不再需要的数据的意外引用也称为“内存泄漏”。将这些引用设置为null将导致垃圾收集器将其从java内存堆中删除。

沿着那条线,您可能会发现WeakReference有帮助。

答案 3 :(得分:1)

你在哪里观察那些150M?这是你的JVM进程占用多少(例如在linux / unix上的 top 命令中可见),还是应用程序使用(和必要)的内存真的?

在应用程序运行时尝试编写以下4个值:

    long free = Runtime.getRuntime().freeMemory();
    long total = Runtime.getRuntime().totalMemory();
    long max = Runtime.getRuntime().maxMemory();
    long used = total - free;

如果“used”的值远低于150M,则可以添加java start参数,例如“-Xmx30M”将应用程序的堆大小限制为30MB。请注意,在这种情况下,JVM进程仍将占用超过30MB的空间。

JVM的内存使用有点棘手。