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

标签 java 64-bit jvm performance sun

我有一个需要一些内存调整的网络应用程序。虽然我已经对应用程序本身进行了概要分析并进行了精简,但在我们最繁忙的实例中,JVM 本身对我来说似乎过于臃肿了。 (低容量的实例没有这个问题。)详情:

  • 平台:
    • RHEL4 64 位(Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64)
    • Sun Java 6(Java HotSpot(TM) 64 位服务器 VM(构建 10.0-b23,混合模式))
    • startup.sh 中带有 -d64 的 Tomcat 6>
  • 我的网络应用目前有一些代码在生产中需要运行 64 位的好处。
  • 我观察到一段时间后(一周)JVM 的常驻内存大小(如顶部所示)是我的 -Xmx 设置大小的三倍
  • 非堆内存大小等都是比较微不足道的,只是堆大小的个位数百分比
  • 只有一段代码需要64位地址空间

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

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

最佳答案

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

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

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

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

提示:打开 UseCompressedOops 标志,使用 -XX:+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 .

关于java - -d64 开关对 Sun JVM 常驻内存使用有什么影响(如果有的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443677/

相关文章:

c# - C# 中的匿名内部类?

java - 下载servlet很慢

c++ - 从文件中读取 64 位整数字符串

r - 从 R (x64) 连接到 MS Access 数据库

java - 线程上下文类加载器和普通类加载器的区别

java - 如何用 Java 将服务器与游戏启动器互连?

java - Android webview读取cookies

windows - 适用于 Windows 64 位的 osm2pgsql 最新版本在哪里

regex - 正则表达式的 Kotlin 性能问题

java - JAXP00010004 和 java.lang.OutOfMemoryError : GC overhead limit exceeded