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

关于,jvm,指针,压缩,性能,研究 · 浏览次数 : 138

小编点评

**指针压缩对JVM性能的影响** **研究摘要** 指针压缩是一种在内存中优化JVM进程的方法,可以提高进程启动和执行效率。在32位JVM中,由于内存对消最小是8bytes,因此32G内存情况下可以使用4G的指针。 当内存大于32G时,必须使用64位的指针,这会导致非堆区的内存膨胀与性能劣化。 **实验结果** 通过测试,发现指针压缩在同内存情况下可带来10%左右的性能提升。当内存增加一倍时,指针压缩仍然能带来5%左右的性能提升。 **结论** 指针压缩是一种可用于提升JVM性能的方法,尤其是在内存大于32G的情况下。在同内存情况下,打开内存指针压缩可以带来10%左右的性能提升。 **主要代码片段** ```bash for i in `cat list.txt` ; do echo $i ; ./run-specjvm.sh $i -ikv > resultwithoutcompress/$i ; done ``` **分析** 脚本首先读取一个文件中的列表,然后遍历每个测试命令。对于每个测试命令,脚本执行以下步骤: 1. 创建一个新的线程,并将其指定为测试命令。 2. 在新的线程中执行测试命令。 3. 将结果保存到一个文件中。 通过这种方法,脚本可以同时运行多个测试命令并收集结果。 结果显示,指针压缩在同内存情况下可带来10%左右的性能提升。当内存增加一倍时,指针压缩仍然能带来5%左右的性能提升。

正文

关于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



与关于JVM指针压缩性能的研究相似的内容:

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

关于JVM指针压缩性能的研究 摘要 JVM的内存对消最小是 8bytes 所以32G内存的情况下可以使用 32位的指针就可以了. 32位就是4G 在乘以最小的内存extent 8 bytes 的出来可以指向 32G的内存区域. 如果大于32G, 那么必须使用64位的指针. 理论上会导致非堆区的内存膨

[转帖]【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列

【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列 作者:冰河 2022-11-04 四川 本文字数:13519 字 阅读完需:约 44 分钟 写在前面 最近,一直有小伙伴让我整理下关于 JVM 的知识,经过十几天的收集与整理,初版算是整理出来了。希望对大家有所帮助。 JDK 是

万字详解JVM,让你一文吃透

摘要:本文将带大家详细地了解关于JVM的一些知识点。 本文分享自华为云社区《【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列》,作者: 冰 河 。 JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境。 Java 程序设计语言 Java 虚拟机 Java API类库 J

[转帖]万字详解 JVM,让你一文吃透

https://my.oschina.net/u/4526289/blog/5588880 摘要:本文将带大家详细地了解关于 JVM 的一些知识点。 本文分享自华为云社区《【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列》,作者: 冰 河 。 JDK 是什么? JDK 是用于支

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的

[转帖]技术派-关于最佳线程数的计算的准确理解

Venkat Subramaniam 博士在《Programming Concurrency on the JVM》中提到关于最优线程数的计算: The minimum number of threads is equal to the number of available cores. If a

[转帖]JVM系列之:你知道Java有多少种内存溢出吗

本文为《深入学习 JVM 系列》第二十五篇文章 Java内存区域 关于这部分内容大多来源于《深入理解Java虚拟机》一书。 Java 运行时数据区域(JDK8)如下图所示: 关于上述提到的线程共享和线程隔离区域,下图做详细讲解: 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的

关于对于Java中Entity以及VO,以及DTO中Request对象序列化的学习

关于 Serializable的探讨 前提引入 是由于软件测试上有同学提到说,什么该字段在程序刚运行时,导致jvm激增,所以吸引了我的注意 回顾代码 MybatisPlus Generator自动生成的entity中就经常带有这个, 而且我在开发代码的时候VO,以及DTO常常是直接复制对应的enti

多线程知识:三个线程如何交替打印ABC循环100次

本文博主给大家讲解一道网上非常经典的多线程面试题目。关于三个线程如何交替打印ABC循环100次的问题。 > 下文实现代码都基于Java代码在单个JVM内实现。 ## 问题描述 给定三个线程,分别命名为A、B、C,要求这三个线程按照顺序交替打印ABC,每个字母打印100次,最终输出结果为: ``` A