我正在使用Eclipse Indigo在Java中创建应用程序。当我使用Eclipse运行它时,任务管理器显示javaw.exe正在使用50mb的内存。当我将应用程序导出为可运行的.jar并执行.jar时,任务管理器显示javaw.exe正在使用500mb。 为什么是这样?我怎么能解决这个问题?
编辑:我使用的是Windows 7 64位,我的系统说我安装了Java 1.7。显然,内存问题是由while循环引起的。我将研究while循环内部导致问题的原因。
编辑:发现问题。在while循环中的某个点创建了新的BufferedImage
个实例,而不是替换相同的BufferedImage
。
答案 0 :(得分:0)
如果没有关于代码的任何其他详细信息,我建议使用分析器来分析问题。我知道YourKit和可用于NetBeans的那个非常好。
从分析器运行应用程序后,您应该首先查看应用程序包创建的对象和侦听器。如果问题不存在,您可以将搜索范围扩展到其他包,直到找到失控的内容,然后查看处理这些实体的代码。
当您多次运行代码的某些部分并在代码停止运行后仍然看到内存利用率时,您可能会发生泄漏,并且可能会考虑在退出时清空或清空变量/侦听器。
这应该是一个很好的起点,但请报告您的结果,我们知道它是怎么回事。顺便说一句,你使用的操作系统是什么版本的java?
- 路易斯
答案 1 :(得分:0)
您需要分析您的代码以获得确切的答案,但根据我的经验,当我看到类似的东西时,我经常把它等同于垃圾收集。例如,我运行相同的工作,并给了一个工作10演出和另外2演出..运行并完成但10gig一个使用更多的内存(并完成更快)而第二个(2gig)一个,我相信,垃圾收集所以它仍然完成但是用更少的内存花费了更多的时间。我对java有点新意,所以我可能会假设垃圾收集,但我已经看到了你在说什么。
您需要分析您的代码(查看jconsole,它包含在java或visualVM中)..
答案 2 :(得分:0)
听起来最奇特。
我可以想到两种可能的解释:
您查看了错误的javaw.exe
实例。也许你看过运行Eclipse的实例......这可能是那么大,或者更大。
您(以某种方式)设法将Java配置为默认情况下使用大堆运行。在Linux上,您可以使用包装器脚本,shell函数或shell别名来完成此操作。您至少可以在Windows上执行第一个。
我认为这不是JAR文件本身。 AFAIK,您无法在JAR文件中设置JVM参数。您可能在某种程度上在JAR文件中包含了不同版本的内容,但这有点紧张......
如果这些想法都没有帮助,请尝试分析。
发现问题。在while循环中的某个点创建新的BufferedImage实例,而不是替换相同的BufferedImage。
啊,是的。 BufferedImage使用大量的堆外内存,需要谨慎管理。
但这并不能解释为什么你的应用程序在从JAR运行时比从Eclipse启动时使用更多内存...除非你告诉应用程序做不同的事情。