我们提供在Linux、AIX和HP-Ux (PA-RISC)上运行的Java应用程序。我们似乎很难在HP-Ux上从在其他两个环境中运行良好的应用程序中获得可接受的性能水平。执行时间和内存消耗都是如此。
虽然我还没有找到关于“为什么”的权威文章,但我认为使用"top“来测量内存消耗是一种粗糙的方法,因为像共享代码这样的东西会给出误导性的结果。然而,在一个客户站点上,HP-Ux上的内存消耗已经成为一个问题,这就是我们要做的。这一次,当我们从Java 1.4迁移到Java 1.5 (在HP-Ux 11.23 PA-RISC上)时,这才成为一个问题。所谓“问题”,我的意思是机器停止创建新进程,因为我们已经耗尽了所有16 of的物理内存。
通过测量“之前”和“之后”的总“空闲内存”,我们试图衡量Java应用程序消耗了多少内存。我编写了一个在ArrayList中存储10,000个随机64位字符串的快速应用程序,并在Java1.4和Java1.5下尝试了这种方法来测量Linux和HP-Ux上的消耗。
结果:
HP Java 1.4 ~60MB
HP Java 1.5 ~150MB
Linux Java 1.4 ~24MB
Linux Java 1.5 ~16MB
有人能解释为什么会出现这些结果吗?这是"top“测量空闲内存的方式的某种特性吗?HP上的Java 1.5消耗的内存真的是Java 1.4的2.5倍吗?
谢谢。
发布于 2008-10-30 02:55:12
我现在还没有惠普游戏机来验证我的假设。但是,如果我是您,我会使用像JConsole(JDK附带的)或您的工具包这样的分析器来测量正在发生的事情。
但是,看起来您是在发现错误之后才开始测量的;因此,我并不认为它正在发生--只是向您指出了我在相同情况下会做的事情。
发布于 2008-10-30 04:23:23
JVM可能只是有不同的默认参数。堆将增长到您已配置的大小。Sun VM上的缺省值是机器中RAM的某个百分比-也就是说,如果您使用的机器上有更多的内存,那么在默认情况下,Java将使用更多的内存。
如果HP-UX虚拟机没有经过HP对这类事情的大量调整,我会感到非常惊讶。我建议您修改这两者的参数-找出在不影响性能或吞吐量的情况下可以使用的最小最大堆大小。
发布于 2008-10-30 04:16:18
首先,不清楚您通过"10,000个随机64位字符串“测试测量的是什么。您应该启动应用程序,测量它的引导内存占用,然后运行测试。Java 1.5很容易在启动后立即获得更多堆(例如,由于堆管理器设置)。
其次,我们在HP-UX下运行1.4、1.5和1.6版本的Java应用程序,它们没有表现出任何特殊的内存需求。不过,我们有安腾硬件。
第三,为什么使用top?为什么不直接打印Runtime.getRuntime().totalMemory()呢?
第四,通过向ArrayList添加值,可以创建内存碎片。ArrayList必须时不时地将其内部存储空间翻倍。根据GC设置和ArrayList.ensureCapacity()实现的不同,未收集的内存量在1.4和1.5之间可能有很大的不同。
本质上,您没有找出问题的原因,而是运行了一个没有给您任何有用信息的随机测试。您应该在应用程序上运行分析器,以找出内存泄漏的位置。
https://stackoverflow.com/questions/249132
复制相似问题