jvm指针压缩和内存对齐的学习
背景
最近要搞一个测试工作.
想着能够提高一下在国产服务器上面的性能.
想到一个办法是, 提高JVM的内存配置.
减少GC数量来提高性能.
但是同时觉得 jvm开启指针压缩的大小其实是 32G内存.
这里其实一直有一个疑惑.
一般的网上说法都是 需要低于32G, 但是没有说具体的内存大小.
所以想着能够学习一下并且根据网上的只是
增加上jvm 内存对齐看看能否提高一下 jvm 指针压缩时的内存量级
第一步查看是否有没有开启指针压缩
jinfo -flag InitialHeapSize 8488
-XX:InitialHeapSize=25769803776
jinfo -flag MaxHeapSize 8488
-XX:MaxHeapSize=25769803776
jinfo -flag UseCompressedOops 8488
-XX:+UseCompressedOops
另外一台服务器:
info -flag MaxHeapSize 2352809
-XX:MaxHeapSize=34359738368
info -flag UseCompressedOops 2352809
-XX:-UseCompressedOops
验证内存大小效果-JDK8
/jdk/bisheng-jdk1.8.0_332/bin/java -Xmx32767m -XX:+UseCompressedOops -version
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
openjdk version "1.8.0_332"
/jdk/bisheng-jdk1.8.0_332/bin/java -Xmx32766m -XX:+UseCompressedOops -version
openjdk version "1.8.0_332"
验证内存大小效果-JDK11
java -Xmx32736m -XX:+UseCompressedOops -version
openjdk version "11.0.6" 2020-01-14 LTS
java -Xmx32737m -XX:+UseCompressedOops -version
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
openjdk version "11.0.6" 2020-01-14 LTS
指针压缩内存
32G内存是 32768m 内存
jdk 8 的内存大小是: 32766m 内存可以压缩
jdk 11的内存大小是: 32736m 内存可以压缩
jdk 17的内存大小是: 32736m 内存可以压缩
增加内存对齐验证
java -Xmx63g -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 -version
openjdk version "11.0.6" 2020-01-14 LTS
java -Xmx64g -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 -version
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
openjdk version "11.0.6" 2020-01-14 LTS
java -Xmx127g -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=32 -version
openjdk version "11.0.6" 2020-01-14 LTS
java -Xmx128g -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=32 -version
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
openjdk version "11.0.6" 2020-01-14 LTS
增加内存对齐后的设置
内存对齐默认是 8bytes
也就是默认所有的对象占用都是 8字节的倍数
markword 使用4字节进行表示是 是 2的32次方的数量
简单换算一下就是 2的32次方 乘以 8 字节 也就是 4Gbit*8bytes 也就是 32G内存的大小.
换算到 16字节的对齐 就是 63G左右可以指针压缩.
缓缓道 32字节的对齐 就是 127G左右的内存可以指针压缩
其实按理说, 如果能够实现 64字节的压缩
跟CPU的cache line 保持一致, 理论上不会出现cache line的伪共享.
理论上对性能有一定的优化效果
所有的一切, 等有时间了找同事进行一下性能验证.
标签:jvm,压缩,XX,version,内存,UseCompressedOops,对齐
From: https://www.cnblogs.com/jinanxiaolaohu/p/18096808