当前位置: 首页 > 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压力;当指针移动时,减少带宽损耗。


在这里插入图片描述

相关文章:

  • 超越Devin!姚班带队,他们创大模型编程新世界纪录
  • Python3 元组
  • 制造企业如何通过PLM系统实现BOM管理的飞跃
  • AI的绘画工具有哪些?
  • 批量归一化(BN)和层归一化(LN)的区别
  • 【电子通识】什么是电力电子
  • 001----flask
  • C#,JavaScript实现浮点数格式化自动保留合适的小数位数
  • Flutter 中的 SliverLayoutBuilder 小部件:全面指南
  • Flutter:革新移动开发的开源框架
  • Android 图表开发开源库 MPAndroidChart 使用总结
  • C++面试题其二
  • 学习小心意——python的构造方法和析构方法
  • Configure Google Chrome Settings with Group Policy
  • B端UI设计,演绎高情逸态之妙
  • [数据结构]链表的实现在PHP中
  • CEF与代理
  • egg(89)--egg之redis的发布和订阅
  • Git 使用集
  • HTML-表单
  • jdbc就是这么简单
  • Joomla 2.x, 3.x useful code cheatsheet
  • js算法-归并排序(merge_sort)
  • Node项目之评分系统(二)- 数据库设计
  • Puppeteer:浏览器控制器
  • python docx文档转html页面
  • Python进阶细节
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • tab.js分享及浏览器兼容性问题汇总
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 技术胖1-4季视频复习— (看视频笔记)
  • 今年的LC3大会没了?
  • 普通函数和构造函数的区别
  • 使用Swoole加速Laravel(正式环境中)
  • 我从编程教室毕业
  • 我是如何设计 Upload 上传组件的
  • 大数据全解:定义、价值及挑战
  • 国内开源镜像站点
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # 数仓建模:如何构建主题宽表模型?
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $jQuery 重写Alert样式方法
  • $L^p$ 调和函数恒为零
  • (11)iptables-仅开放指定ip访问指定端口
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别