首页 > 系统相关 >jvm指针压缩和内存对齐的学习

jvm指针压缩和内存对齐的学习

时间:2024-03-26 15:46:24浏览次数:20  
标签:jvm 压缩 XX version 内存 UseCompressedOops 对齐

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

相关文章

  • [转帖]JVM之指针压缩&内存如何设置
    https://www.cnblogs.com/liang1101/p/12727754.html 在32位到64位的转变中,人们最大的获益是内存容量。在一个32位的系统中,内存地址的宽度就是32位,这就意味着,我们最大能获取的内存空间是2^32(也就是4G)字节。这个容量明显不够用!在一个64位的机器中,理论上,我们能获取到的内......
  • c++栈内存溢出问题
    问题说明实验课测量快排时间时,用intar[MAXSIZE+1];来创建数组,数据规模从1000-10000,而MAXSIZE的设置不能超过600000,超过了程序就无法运行直接中断,理论上这是不应该。程序中用rand()生成随机数据,但若对数据求模rand()%100,则程序运行到中途会异常中断。问题原因intar[M......
  • JVM的一些小记
    把最近的一些从jvm原理书中的一些摘要记一下JVM1.对象的内存布局是什么样子?对象在堆内存中的存储布局可以划分3个部分,对象头,实例数据,对齐填充。对象头包括两个部分,第一是对象的运行时数据,如对象哈希码,GC分代年龄,锁状态等,这部分称作MarkWord。第二是类型指针,java通过......
  • 面试类-JVM原理(四)
    说说解释执行和编译执行的区别(补充)先说解释和编译的区别:解释:将源代码逐行转换为机器码。编译:将源代码一次性转换为机器码。一个是逐行,一个是一次性,再来说说解释执行和编译执行的区别:解释执行:程序运行时,将源代码逐行转换为机器码,然后执行。编译执行:程序运行前,将源代码一次......
  • C语言中整数和浮点数在内存中的存储
    一、整数在内存中的存储我们知道整数的二进制表示形式有三种,原码、反码、补码。三种表示方法均由符号位和数值位两部分构成,符号位用0表示正,用1表示负,最高一位被当作符号位,其余位被当作数值位。其中,正整数的原码、反码、补码三种表示相同负整数的原码:对应10进制数直接转换过......
  • C语言-内存函数
    文章目录1.memcpy1.1.memcpy语法形式1.2.memcpy的模拟实现2.memmove2.1.memmove的语法形式2.2.memmove的模拟实现3.memset3.1.memset的语法形式4.memcmp4.1.memcmp的语法形式1.memcpy1.1.memcpy语法形式void*memcpy(void*destinotion,const*source,size_tnu......
  • C++动态内存管理
    目录C/C++内存分配C++内存管理C++内存管理介绍C++内存管理使用C++内存管理基本语法operatornew和operatordelete函数定位new表达式(placement-new)基本语法使用场景malloc/free和new/delete相同点不同点C/C++内存分配在C语言动态内存管理章节已经了解到内......
  • Java的方法、重载、递归、内存
    一、方法什么是方法方法:一堆代码的集合,一般完成了某个特定的功能,当我们再次使用这个方法的时候,就等于使用了这些代码。方法目的:代码复用,提高程序灵活度,易维护,易扩展。方法的声明修饰符列表  返回值类型  方法名 (参数列表){ 方法体 }注意事项修饰符列表 ......
  • JVM高频面试题---垃圾回收(3)
    JVM(3)垃圾回收对象什么时候可以被垃圾器回收?JVM垃圾回收算法有哪些?说一下JVM的分代回收说一下JVM有哪些垃圾回收器详细说一下G1垃圾回收器强引用、软引用、弱引用、虚对象......
  • 每日面经分享(操作系统:内存、缓存、硬盘)
    1.用户态和内核态的区别a.用户态和内核态是操作系统中的两种不同的执行模式,用于区分应用程序代码和操作系统内核代码的权限和特权级别。b.用户态是指应用程序运行时所处的执行模式。在用户态下,应用程序只能访问受限资源和执行受限操作,无法直接访问底层硬件或执行特权操......