当前位置: 首页 > news >正文

JVM 指针压缩

运用java内存对齐填充,对java内存进行8字节划分,java对象指针映射到每个划分区域上,使得4个字节(32位)表示2^32个地址,从而使4个字节指针映射32G内存空间。

1.为什么进行指针压缩:

  • jvm从32位变为64位,内存带宽也增加了一倍,原来32位存储一个变量,现在可以使用64位存储,无形中浪费了大量空间。占用较大带宽,同时GC也会承受较大压力。
  • .为了减少64位平台下内存的消耗,启用指针压缩功能
  • 在jvm中,32位地址最大支持4G内存(2的32次方),可以通过对对象指针的压缩编码、解码方式进行优化,使得jvm 只用32位地址就可以支持更大的内存配置(小于等于32G)
  • 堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址,即使用低虚拟地址空间
  • 堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址,这就会出现1的问题,所以堆内 存不要大于32G为好

2.开启关闭对象指针压缩

jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩。

  • 启用指针压缩:-XX:+UseCompressedOops(默认开启)
  • 禁止指针压缩:-XX:-UseCompressedOops

对象大小可以用jol-core包查看,引入依赖

implementation group: 'org.openjdk.jol', name: 'jol-core', version: '0.9'

package com;import org.openjdk.jol.info.ClassLayout;public class JOLSample {public static  void  main(String[] args){ClassLayout layout = ClassLayout.parseInstance(new Object());System.out.println(layout.toPrintable());System.out.println();ClassLayout layout1 = ClassLayout.parseInstance(new int[]{});System.out.println(layout1.toPrintable());System.out.println();ClassLayout layout2 = ClassLayout.parseInstance(new A());System.out.println(layout2.toPrintable());}public static class A {int id;String name;byte b;Object o;}
}

配置关闭指针压缩,打印:

# WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf
java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           50 1f c4 30 (01010000 00011111 11000100 00110000) (818159440)12     4        (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total[I object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           10 0c c4 30 (00010000 00001100 11000100 00110000) (818154512)12     4        (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)16     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)20     4        (alignment/padding gap)                  24     0    int [I.<elements>                             N/A
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes totalcom.JOLSample$A object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           08 78 45 32 (00001000 01111000 01000101 00110010) (843413512)12     4                    (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)16     4                int A.id                                      020     1               byte A.b                                       021     3                    (alignment/padding gap)                  24     8   java.lang.String A.name                                    null32     8   java.lang.Object A.o                                       null
Instance size: 40 bytes
Space losses: 3 bytes internal + 0 bytes external = 3 bytes total

开启指针压缩

# WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf
java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           00 10 00 00 (00000000 00010000 00000000 00000000) (4096)12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total[I object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           10 0c 00 00 (00010000 00001100 00000000 00000000) (3088)12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     0    int [I.<elements>                             N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes totalcom.JOLSample$A object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           a8 e9 0d 00 (10101000 11101001 00001101 00000000) (911784)12     4                int A.id                                      016     1               byte A.b                                       017     3                    (alignment/padding gap)                  20     4   java.lang.String A.name                                    null24     4   java.lang.Object A.o                                       null28     4                    (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total

通过指针压缩,类型指针、对象引用等由8字节转为4个字节。降低对象占用的内存大小,顺便减轻GC压力;当指针移动时,减少带宽损耗。


在这里插入图片描述

http://www.lryc.cn/news/361841.html

相关文章:

  • 时序预测 | Matlab灰色-马尔科夫预测
  • 代码界的奥斯卡:SpringBoot测试的艺术与科学
  • 安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案
  • Python | 平均绩点
  • 2024年有什么值得入手的5G长期套餐大流量卡推荐?大流量手机卡入手指南(超4款正规手机卡实测总结)
  • 《尚上优选》项目Bug记录
  • Flutter 中的 PopupMenuTheme 小部件:全面指南
  • uni-app的网络请求库封装及使用(同时支持微信小程序)
  • 力扣524. 通过删除字母匹配到字典里最长单词
  • 【代码随想录】【算法训练营】【第27天】 [39]组合总和 [40] 组合总和II [131]分割回文串
  • 解决 git 命令 Problem with the SSL CA cert (path? access rights?)
  • 详解:重庆耶非凡的选品师项目有哪些优势?
  • DSP28335模块配置模板系列——GPIO配置模板
  • 【SringBoot项目中MyBatis-Plus多数据源应用实践】
  • Android 图表开发开源库 MPAndroidChart 使用总结
  • 手机号脱敏
  • java基础篇(1)
  • 2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第三阶段任务书
  • 微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)
  • PDF格式分析(八十二)——电影注释(movie)
  • Opentracing 代码Demo
  • 笔记93:关于 C++ 中的 Eigen 库
  • 【微服务】部署mysql集群,主从复制,读写分离
  • 【Java】设计一个支持敏感数据存储和传输安全的加解密平台
  • iOS AVFoundation 音视频源码分享
  • Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像“
  • 基于FPGA的SystemVerilog练习
  • 【数据结构】详解堆的基本结构及其实现
  • python无限弹窗的代码
  • 多线程新手村5--线程池