2012-04-08 107 views
0

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

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

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

+1

您确定您不会将Eclipse instane与应用程序实例混淆吗? Eclipse也是一个Java应用程序 - 只是一个猜测。除此之外,您可以尝试使用分析器来弄清楚发生了什么。 – jefflunt 2012-04-08 00:16:30

回答

0

没有关于你的代码的任何额外的细节,我建议使用分析器来分析这个问题。我知道YourKit和NetBeans可用的非常好。

一旦从分析器运行你的应用程序,你应该首先看看你的应用程序包创建的对象和听众。如果问题不存在,那么可以将搜索扩展到其他软件包,直到找出失控的事物,然后查看处理这些实体的代码。

当您运行代码多次的某些部分,仍然可以看到内存的使用后的代码停止运行,那么你可能有泄漏,并可能会考虑退出归零或清空变量/听众。

这应该是一个很好的起点,但请报告你的结果反馈,所以我们知道如何去。顺便说一句,你使用什么操作系统和什么版本的Java?

--Luiz

0

你需要分析代码得到确切的答案,但是从我的经验,当我看到类似的事情我往往等同于垃圾收集。例如,我执行了同样的工作,给了一个工作10个演出和另外两个演出。两个演出都跑完了,但是10个演出使用了更多的内存(并且速度更快),而我认为第二个(2gig)所以它仍然完成,但花更少的时间和更少的内存。我对Java有点新,所以我可能假设垃圾收集,但我已经看到你在说什么。

你需要分析代码(检查JConsole的,它是包含在Java或VisualVM的)..

0

听起来最为奇特。

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

  • 你看着错误javaw.exe实例。也许你看过运行Eclipse的实例......可能是那么大,或者更大。

  • 你(在某种程度上)设法配置Java程序在默认情况下一大堆运行。在Linux上,您可以使用包装脚本,shell函数或shell别名来执行此操作。你至少可以做到Windows上的第一个。

我不认为这是JAR文件本身。 AFAIK,您不能在JAR文件中设置JVM参数。有可能你在某种程度上在JAR文件中包含了不同版本的东西,但这有点夸张......

如果这些想法都不起作用,请尝试分析。


发现问题。在while循环中创建新的BufferedImage实例的地方,而不是替换相同的BufferedImage。

啊是的。 BufferedImage使用大量的堆外存储器,需要仔细管理。

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