【发布时间】:2012-04-29 18:24:52
【问题描述】:
我正在编写一个具有约 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
【问题讨论】:
-
使用分析器(例如最近的 JDK 附带的 visualvm)来找出你的内存首先要去哪里。
-
你在类路径中添加了多少个外部库?
-
我正在使用 4 个外部库 jfreechat、snmp4j、commons-net-3.1 和 jdom-1.1.3
-
你是通过 SAX 还是 DOM 解析的?
-
这个库不能使用这么多内存。你能写你的jvm版本吗,你用的是32-x还是64-x模式?
标签: java optimization memory-management