Java内存消耗,“顶级”和HP-Ux

时间:2008-10-30 02:36:48

标签: java unix memory hp-ux

我们提供在Linux,AIX和HP-Ux(PA-RISC)上运行的Java应用程序。我们似乎很难在其他两种环境中正常工作的应用程序上获得HP-Ux上可接受的性能水平。这对于执行时间和内存消耗都是如此。

虽然我还没有找到关于“为什么”的明确文章,但我认为使用“顶级”来衡量内存消耗是一种粗略的方法,因为共享代码会产生误导性结果。但是,我们必须继续使用HP-Ux内存消耗成为问题的客户站点。这次我们从Java 1.4迁移到Java 1.5(在HP-Ux 11.23 PA-RISC上)时才成为一个问题。 “问题”,我的意思是机器停止创建新的进程,因为我们耗尽了所有16GB的物理内存。

通过测量“之前”和“之后”总“空闲内存”,我们试图估计Java应用程序消耗了多少。我写了一个快速应用程序,在ArrayList中存储10,000个随机64位字符串,并尝试使用这种方法测量Linux和HP-Ux在Java 1.4和Java 1.5下的消耗。

结果:

HP Java 1.4~60MB

HP Java 1.5~150MB

Linux Java 1.4~24MB

Linux Java 1.5~16MB

任何人都可以解释为什么会出现这些结果吗?这是“顶级”测量空闲记忆的方式的一些特质吗? HP上的Java 1.5真的消耗的内存是Java 1.4的2.5倍吗?

感谢。

4 个答案:

答案 0 :(得分:1)

我现在没有HP盒来测试我的假设。但是,如果我是你,我会使用像JConsole(随JDK一起提供)或yourkit来使用分析器来衡量正在发生的事情。

但是,看到你看到有什么不对劲之后就开始测量了;所以,我并不打算说它正在发生 - 只是指着你在同样情况下做过的事情。

答案 1 :(得分:1)

JVM可能只有不同的默认参数。堆将增长到您配置为允许它的大小。 Sun VM上的默认值是机器中RAM的一定百分比 - 也就是说,如果您使用内存更多内存的计算机,Java将默认使用更多内存。

如果HP-UX VM没有针对HP的这类事情进行大量调整,我会感到非常惊讶。我建议你在两者上摆弄参数 - 弄清楚你可以使用的最小最大堆大小,而不会影响性能或吞吐量。

答案 2 :(得分:0)

首先,目前尚不清楚你用“10,000随机64位字符串”测试测量了什么。您应该启动应用程序,测量它的引导内存占用,然后运行您的测试。很可能Java 1.5在启动后立即获得了更多堆(例如,由于堆管理器设置)。

其次,我们在HP-UX下运行1.4,1.5和1.6下的Java应用程序,并且它们不会显示任何特殊的内存要求。不过,我们有Itanium硬件。

第三,为什么要使用顶级?为什么不打印Runtime.getRuntime()。totalMemory()?

第四,通过向ArrayList添加值,可以创建内存碎片。 ArrayList必须偶尔加倍它的内部存储。根据GC设置和ArrayList.ensureCapacity()实现,未收集的内存量可能会在1.4和1.5之间显着不同。

基本上,不是找出问题的原因,而是运行随机测试,不会给你提供有用的信息。您应该在应用程序上运行探查器以找出内存泄漏的位置。

答案 3 :(得分:0)

你可能也想看看你试图解决的问题...我不认为有很多问题需要16GB的内存才能进行一轮优化。

您是否启动了多个虚拟机?您是否正在将大型数据集读入内存,而不是足够快地丢弃它们?等等等。