关于JVM指针压缩性能的研究

济南小老虎 / 2023-05-19 / 原文

关于JVM指针压缩性能的研究


摘要

JVM的内存对消最小是 8bytes 
所以32G内存的情况下可以使用 32位的指针就可以了. 

32位就是4G 在乘以最小的内存extent 8 bytes 
的出来可以指向 32G的内存区域. 

如果大于32G, 那么必须使用64位的指针. 
理论上会导致非堆区的内存膨胀与性能劣化. 

所以本文就想学习与研究一下指针压缩对jvm性能的影响. 

工具

SPECJVM2008
注意安装之前总结过主要如下:

第一步安装
java -jar SPECjvm2008_1_01_setup.jar -i console
注意 需要选择 安装目录等. 以及遵守协议.
第二步简单使用
cd /SPECjvm2008/
验证是否可用
export JAVA_HOME=/some/path/to/java/
然后执行
./run-specjvm.sh startup.helloworld -ikv

测试方法

修改 ./run-specjvm.sh
主要是增加如下内从

指定内存. 不使用指针压缩
$JAVA_EXE $EXTRA_BOOTCLASSPATH_ARG $JAVA_OPTS -Xmx30G -Xms30G -XX:-UseCompressedClassPointers  -jar SPECjvm2008.jar $*

指定内存. 使用指针压缩
$JAVA_EXE $EXTRA_BOOTCLASSPATH_ARG $JAVA_OPTS -Xmx30G -Xms30G  -jar SPECjvm2008.jar $*

测试项目

可以讲测试项目放到list 里面进行循环处理
我这边主要是创建了两个list
startup 是测试单线程的
不带startup 的是测试多线程的
默认是CPU的核心数. 

所以内容如下
startup的list 为:

startup.helloworld startup.compiler.compiler startup.compress startup.crypto.aes 
startup.crypto.rsa startup.crypto.signverify startup.mpegaudio startup.scimark.fft 
startup.scimark.lu startup.scimark.monte_carlo startup.scimark.sor 
startup.scimark.sparse startup.serial  startup.xml.transform startup.xml.validation

对应的测试命令为:

for i in `cat list.txt` ; do echo $i ; ./run-specjvm.sh $i -ikv > resultwithoutcompress/$i ; done

分析脚本和结果简述

grep -ir "Score on " |awk '{print $4}'

发现内存的影响比较小. 设置内存增加一倍, 比较小内存的影响不超过10% 
只有编译的提升比较多

是否开启 内存指针压缩
在同内存的情况下, 开启内存指针有10%左右的性能提升. 


测试结果为

image