3

我正在编写一个具有 ~30 类的 Java/Swing 应用程序,我的问题是当我运行我的程序时,它会加载超过150 M的内存,这正常吗?由于应用程序有 4 个线程,解析一些 XML 文件,加载一些图标文件,并绘制一些 Jfreechat 图表。如果不是,我该怎么做才能最大程度地减少应用程序使用的内存量,是否会影响某些变量为空帮助?是加载一次 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

4 回答 4

4

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

于 2012-04-18T10:47:49.883 回答
3

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

如果您擅长仅加载一次 XML 信息,则仅加载一次 XML 会有所帮助。这意味着,如果不是通过您的应用程序更改了 XML,并且您需要获取更新 - 您将不得不重新加载 XML(并且如果不再需要已弃用的 XML 信息 - 摆脱它)。

于 2012-04-18T10:51:52.643 回答
2

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

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

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

于 2012-04-18T10:52:47.207 回答
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 启动参数,例如“-Xmx30M”,将应用程序的堆大小限制为 30MB。请注意,在这种情况下,JVM 进程仍将占用 30MB 以上的空间。

JVM 的内存使用有些棘手。

于 2012-04-18T13:18:19.750 回答