-d64交换机对Sun JVM驻留内存使用有何影响?

时间:2009-09-18 10:21:27

标签: java 64-bit jvm performance sun

我有这个需要一些内存调整的webapp。虽然我已经在分析应用程序本身并削减了一些东西,但JVM本身在我们最繁忙的实例上看起来过于臃肿。 (较低的卷实例没有此问题。)详细信息:

  • 平台:
    • RHEL4 64位(Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64
    • Sun Java 6(Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
    • -d64
    • startup.sh的Tomcat 6
  • 我的webapp目前有一些代码,在生产中需要运行64位的好处。
  • 我观察到经过一段时间(一周)后,JVM驻留内存大小(如上图所示)是我-Xmx设置大小的三倍
  • 非堆内存大小等都是相对微不足道的,只是堆大小的一位数百分比
  • 只有一段代码需要64位的地址空间

如果我可以重构64位JVM的需要,并删除-d64开关,那会不会使JVM的常驻内存占用更小?换句话说......

-d64交换机对Sun JVM驻留内存使用有什么影响?

1 个答案:

答案 0 :(得分:18)

使用d64开关可使JVM进入64位模式。从技术上讲,在Solaris / Linux和大多数Unix上,JVM进程将在LP64模型中执行。

LP64 model与32位模型(ILP32)的不同之处在于指针恰好是64位宽而不是32位指针。对于JVM,这允许更大的内存寻址能力,但它也意味着单独的对象引用占用的大小增加了一倍。因此,在32位JVM和64位JVM中,给定时间内相同数量的对象会有更大的膨胀。

经常被遗忘的另一件事是指令本身的大小。在64位JVM上,指令的大小将占用本机计算机寄存器大小。

但是,如果在64位环境中使用compressed object pointers,则JVM将尽可能对堆大小超过4 GB的指针进行编码和解码。简而言之,当您使用压缩指针时,JVM会尝试尽可能多地使用32位宽的值。

提示:使用 -XX:+ UseCompressedOops 打开UseCompressedOops标志以消除一些膨胀。 YMMV,但是people have reported upto 50% drop in memory bloat by using compressed oops

修改

The UseCompressedOops flag is supported in version 14.0 of the Java HotSpot VM, available from Java 6 Update 14 onwards