我有这个需要一些内存调整的webapp。虽然我已经在分析应用程序本身并削减了一些东西,但JVM本身在我们最繁忙的实例上看起来过于臃肿。 (较低的卷实例没有此问题。)详细信息:
Linux 2.6.9-78.0.5.ELsmp #1 SMP x86_64
)Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
)-d64
startup.sh
的Tomcat 6
如果我可以重构64位JVM的需要,并删除-d64
开关,那会不会使JVM的常驻内存占用更小?换句话说......
-d64
交换机对Sun JVM驻留内存使用有什么影响?
答案 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。
修改