11

我有这个需要一些内存调整的 web 应用程序。虽然我已经对应用程序本身进行了概要分析并进行了精简,但在我们最繁忙的实例上,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带有in 的Tomcat 6startup.sh
  • 我的 webapp 目前有一些代码在生产中需要运行 64 位的好处。
  • 我观察到一段时间(一周)后,JVM 常驻内存大小(如顶部所示)是我的 -Xmx 设置大小的 三倍。
  • 非堆内存大小等都相对微不足道,仅占堆大小的个位数百分比
  • 只有一段代码需要 64 位位地址空间

如果我可以重构出对 64 位 JVM 的需求并放弃该-d64开关,这是否会使 JVM 的驻留内存占用更小?换句话说...

-d64该开关对 Sun JVM 常驻内存使用有什么影响(如果有的话) ?

4

1 回答 1

18

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

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

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

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

提示:打开 UseCompressedOops 标志,使用-XX:+UseCompressedOops来消除一些膨胀。YMMV,但人们报告说通过使用压缩 oops 可以减少高达 50% 的内存膨胀

编辑

Java HotSpot VM 14.0 版支持 UseCompressedOops 标志,从 Java 6 Update 14 开始提供

于 2009-09-18T12:08:08.830 回答