【问题标题】:Java .jar uses too much memoryJava .jar 使用太多内存
【发布时间】:2012-04-08 00:03:49
【问题描述】:

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

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

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

【问题讨论】:

  • 您确定没有将 Eclipse 实例与应用程序实例混淆吗? Eclipse 也是一个 java 应用程序——只是一个猜测。除此之外,您可以尝试使用分析器来了解发生了什么。

标签: java memory jar memory-leaks executable-jar


【解决方案1】:

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

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

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

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

--路易斯

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这听起来很奇怪。

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

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

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

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

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


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

      啊,是的。 BufferedImage 使用大量堆外内存,需要谨慎管理。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2010-12-02
        • 1970-01-01
        相关资源
        最近更新 更多