0

我正在使用 Eclipse Indigo 在 Java 中制作应用程序。当我使用 Eclipse 运行它时,任务管理器显示 javaw.exe 正在使用 50mb 的内存。当我将应用程序导出为可运行的 .jar 并执行 .jar 时,任务管理器显示 javaw.exe 正在使用 500mb。为什么是这样?我该如何解决这个问题?

编辑:我使用的是 Windows 7 64 位,我的系统说我安装了 Java 1.7。显然内存问题是由while循环引起的。我将研究导致问题的 while 循环内部的内容。

编辑:发现问题。在 while 循环中的某一时刻BufferedImage,创建了新实例,而不是替换相同的BufferedImage.

4

3 回答 3

0

如果没有关于您的代码的任何其他详细信息,我建议使用分析器来分析问题。我知道 YourKit 和可用于 NetBeans 的那个非常好。

从分析器运行应用程序后,您应该首先查看应用程序包创建的对象和侦听器。如果问题不存在,您可以将搜索范围扩大到其他包,直到您识别出越来越失控的事物,然后查看处理这些实体的代码。

当您多次运行代码的某些部分并且在该代码停止运行后仍然看到内存利用率时,您可能会出现泄漏,并且可能会考虑在退出时将变量/侦听器清空或清空。

这应该是一个很好的起点,但请报告您的结果,以便我们了解进展情况。顺便问一下,您使用的是什么操作系统以及什么版本的 java?

——路易斯

于 2012-04-08T00:20:42.740 回答
0

您需要分析您的代码以获得确切的答案,但根据我的经验,当我看到类似的事情时,我经常将其等同于垃圾收集。例如,我运行相同的工作,给了一份工作 10 个演出,另外 2 个演出。两者都运行并完成了,但 10 个工作使用了更多内存(并且完成得更快),而第二个(2 个工作)我相信,垃圾收集所以它仍然完成但需要更多的时间和更少的内存。我对java有点陌生,所以我可能假设垃圾收集,但我已经看到你在说什么。

您需要分析您的代码(查看 jconsole,它包含在 java 或 visualVM 中)..

于 2012-04-08T00:26:04.303 回答
0

这听起来最奇特。

我能想到两种可能的解释:

  • 你看错了javaw.exe实例。也许您查看了运行 Eclipse 的实例……它可能有那么大,或者更大。

  • 您已经(不知何故)设法将 Java 配置为默认使用大堆运行。在 Linux 上,您可以使用包装脚本、shell 函数或 shell 别名来执行此操作。您至少可以在 Windows 上执行其中的第一个。

我不认为它是 JAR 文件本身。AFAIK,您不能在 JAR 文件中设置 JVM 参数。您可能以某种方式在 JAR 文件中包含了某些内容的不同版本,但这有点牵强...

如果这些想法都没有帮助,请尝试分析。


发现问题。在 while 循环中的某一时刻,创建了新的 BufferedImage 实例,而不是替换相同的 BufferedImage。

是的。BufferedImage 使用大量的堆外内存,需要小心管理。

但这并不能解释为什么您的应用程序从 JAR 运行时比从 Eclipse 启动时使用更多的内存......除非您告诉应用程序做不同的事情。

于 2012-04-08T00:37:41.753 回答