为什么要指针压缩,为什么能指针压缩?原理是什么?
指针压缩(Compressed Oops)的原理与实现
指针压缩是 JVM 在 64 位环境 下优化内存占用的关键技术,通过减少对象指针的内存开销,提升缓存利用率和性能。以下是其核心原理与设计细节:
一、为什么要指针压缩?
在 64 位系统中,原生指针占用 8 字节,而 32 位指针仅需 4 字节。Java 对象在堆中存储时,包含以下指针:
- 对象头指针:指向类元数据(Klass Pointer)。
- 实例字段指针:引用其他对象(如
String name)。
对于大量小对象(如 Integer、ListNode),指针的内存开销占比显著。例如:
- 32 位系统:对象头(8 字节)+ 指针字段(4 字节) = 12 字节。
- 64 位系统(无压缩):对象头(16 字节)+ 指针字段(8 字节) = 24 字节(内存翻倍)。
指针压缩通过将 64 位指针压缩为 32 位,减少内存占用,从而:
- 降低 GC 压力:减少堆内存使用,缩短垃圾回收时间。
- 提升缓存命中率:更紧凑的内存布局提高 CPU 缓存利用率。
二、为什么能指针压缩?
64 位系统的理论地址空间极大( 2 64 2^{64} 264),但实际应用场景中,堆内存通常远小于此。例如:
- JVM 堆上限:通常设置为数十 GB,如
-Xmx32G。 - 地址对齐:JVM 默认以 8 字节 对齐对象(
ObjectAlignmentInBytes=8)。
基于此,32 位压缩指针可通过 基地址 + 偏移量 覆盖实际堆范围:
- 偏移量范围:32 位可寻址 2 32 2^{32} 232 个对齐单元。
- 实际堆大小: 2 32 × 8 字节 = 32 GB 2^{32} \times 8 \text{字节} = 32\text{GB} 232×8字节=32GB。
因此,只要堆大小 ≤32GB,压缩指针即可覆盖全部地址。
三、指针压缩的实现原理
1. 指针编码与解码
-
压缩过程(Encode):
将 64 位地址转换为 32 位压缩指针。真实地址 = 基地址 + (压缩指针 << 3)<< 3是因为对象按 8 字节对齐,压缩指针的单位为 8 字节。
-
解压缩过程(Decode):
从 32 位压缩指针还原 64 位地址。压缩指针 = (真实地址 - 基地址) >> 3
2. 基地址(Narrow Oop Base)
- 基地址选择:JVM 将堆起始地址对齐到更大的边界(如 4GB),确保压缩指针偏移量在 32 位范围内。
- 零基址优化:若堆起始地址为 0,可直接使用偏移量(
真实地址 = 压缩指针 << 3)。
3. 内存对齐的代价
- 空间浪费:对象大小需填充至 8 字节的倍数。例如,7 字节的对象实际占用 8 字节。
- 优化手段:通过
-XX:ObjectAlignmentInBytes调整对齐粒度(默认 8,可设为 16)。
四、指针压缩的启用与限制
| 条件 | 说明 |
|---|---|
| JVM 参数 | -XX:+UseCompressedOops(默认开启,堆 ≤32GB 时有效)。 |
| 堆大小限制 | ≤32GB(若堆 >32GB,需关闭压缩指针或增大对齐粒度)。 |
| 对齐粒度调整 | -XX:ObjectAlignmentInBytes=16,堆上限扩展至 64GB(但内存浪费增加)。 |
五、性能影响与权衡
| 场景 | 收益 | 代价 |
|---|---|---|
| 小对象密集型应用 | 内存减少 30%~50%,GC 暂停缩短。 | 略微增加 CPU 计算开销(编解码)。 |
| 大堆(>32GB) | 无法使用压缩指针,需权衡内存与性能。 | 原生 64 位指针占用更多内存。 |
六、示例:压缩指针的实际效果
// 启用压缩指针(默认)
class Student {int id; // 4 字节String name; // 压缩后 4 字节
}// 对象内存布局(64 位 JVM,压缩开启):
// 对象头(12 字节) + id(4) + name(4) + 对齐填充(0) = 20 字节
// 若不压缩:对象头(16) + id(4) + name(8) + 填充(4) = 32 字节
🐒
- 目标:通过减少指针内存占用,优化堆空间利用率和程序性能。
- 条件:堆 ≤32GB,对象按 8 字节对齐。
- 原理:基于基地址的偏移量编码,利用地址对齐特性压缩存储。
- 权衡:在内存节省与计算开销之间取得平衡,适用于大多数 Java 应用场景。

相关文章:
为什么要指针压缩,为什么能指针压缩?原理是什么?
指针压缩(Compressed Oops)的原理与实现 指针压缩是 JVM 在 64 位环境 下优化内存占用的关键技术,通过减少对象指针的内存开销,提升缓存利用率和性能。以下是其核心原理与设计细节: 一、为什么要指针压缩?…...
pyproj 库中Geod类—geod.npts()方法讲解
二、pyproj 库中Geod类geod.npts()方法讲解 geod.npts() 方法用于在起点和终点之间生成沿测地线均匀分布的中间点 示例演示 from pyproj import Geod# 初始化 WGS84 椭球体 geod Geod(ellps"WGS84")# 起点:北京 (116.4, 39.9),终点ÿ…...
使用DeepSeek API进行情感分析:超简单
文章目录 1. 引言1.1 情感分析概述1.2 为什么选择DeepSeek API1.3 本文目标 2. 技术方案对比2.1 传统情感分析方法2.2 基于LLM的方法DeepSeek API优势 3. DeepSeek 情感分析实战3.1 Few-shot Learning方法3.2 完整的DeepSeek API调用示例3.3 案例演示 4. DeepSeek开发情感分析工…...
一套SaaS多租户医疗云his源码,基于云计算的医院信息管理系统(云HIS)
基于云计算的医院信息管理系统(云HIS),通过SaaS服务模式提供。这种云HIS系统设计考虑了模板化、配置化、智能化和可扩展性,覆盖了基层医疗机构的核心工作流程,并且能够与监管系统无缝对接,满足未来的扩展需…...
数据处理与机器学习入门
一、数据处理概述 数据处理是通过统计学、机器学习和数据挖掘方法从原始数据中提取有价值信息的过程。数据处理的目标是将杂乱无章的原始数据转化为可用于分析和建模的结构化数据。对于小规模数据处理,常用工具分为两类: • 可视化分析工具:…...
Qt中绘制不规则控件
在Qt中绘制不规则控件可通过设置遮罩(Mask)实现。以下是详细步骤: 继承目标控件:如QPushButton或QWidget。重写resizeEvent:当控件大小变化时,更新遮罩形状。创建遮罩区域:使用QRegion或QPain…...
【SPP】深入解析蓝牙 L2CAP 协议在SPP中的互操作性要求 —— 构建可靠的蓝牙串口通信基础
在蓝牙协议体系中,L2CAP(Logical Link Control and Adaptation Protocol)作为基带协议与高层协议之间的桥梁,承担着数据分帧、协议复用、QoS协商等核心功能。当涉及串行端口通信时,L2CAP的规范实现直接决定了设备间数据…...
21 模板方法(Template Method)模式
模板方法模式 1.1 分类 (类)行为型 1.2 提出问题 做一款数据挖掘的程序,需要支持不同格式的数据文件,虽然文件格式不同,实现步骤基本一致。 1.3 解决方案 定义一个算法骨架,而将一些步骤延迟到子类。…...
一些练习 C 语言的小游戏
一些练习 C 语言的小游戏 — 1. 猜数字游戏 描述:程序随机生成一个数字,玩家需要猜测这个数字,并根据提示(太高或太低)调整猜测,直到猜中为止。 功能点: 随机数生成 (rand() 函数)。循环和…...
【AI News | 20250331】每日AI进展
AI Repos 1、MCP-Chinese-Getting-Started-Guide 模型上下文协议(MCP)是一个创新的开源协议,旨在标准化大语言模型(LLM)与外部数据源及工具的连接方式,类似AI应用的“USB-C接口”。其核心功能包括资源、提…...
程序化广告行业(45/89):RTB竞价后续流程、结算规则及相关要点解读
程序化广告行业(45/89):RTB竞价后续流程、结算规则及相关要点解读 大家好!一直以来,我都希望能和大家一起在程序化广告这个领域不断探索、共同成长,这也是我写这系列博客的初衷。之前我们了解了程序化广告…...
Python人工智能大模型入门教程:从零构建高性能预测模型
引言:AI大模型时代的技术革命 在AlphaGo战胜人类棋手的里程碑事件后,人工智能技术进入爆发式发展阶段。本教程将带您从零开始,使用Python构建一个工业级神经网络模型。通过本教程,您不仅能掌握GPU加速训练、混合精度计算等前沿技…...
C++/数据结构:哈希表知识点
目录 哈希表 理解哈希表 哈希值(整形) BKDR哈希 异或组合 hash_combine 哈希函数 直接定址法 除留余数法 平方取中法 基数转换法 哈希冲突 开放定址法 哈希桶 unordered_map和unorder_set如何共用一个哈希桶模板类 stl的哈希桶中Insert如…...
基于SpringBoot的求职招聘网站系统(源码+数据库)
473基于SpringBoot的求职招聘网站系统,本系统共分为2个角色:系统管理员、用户,主要功能如下 【前台功能】 用户角色功能: 1. 注册和登录:注册账户并登录系统,以便访问更多功能。 2. 个人信息管理&#x…...
Linux : System V 共享内存
目录 一 前言 二 共享内存概念 三 共享内存创建 四 查看共享内存 五 共享内存的删除 六 共享内存的关联 七 共享内存去关联 八 共享内存的使用(通信) 九 共享内存的特点 一 前言 共享内存区是最快的IPC形式(进程间通信࿱…...
端到端语音识别案例
《DeepSeek大模型高性能核心技术与多模态融合开发(人工智能技术丛书)》(王晓华)【摘要 书评 试读】- 京东图书 语音识别这一技术正如其名,是通过精密地解析说话人的语音来识别并准确转写出其所说的内容。它不仅仅是一个简单的转录过程&#…...
【软件系统架构】微服务架构
一、引言 随着互联网技术的快速发展,传统的单体应用架构在面对复杂业务需求时逐渐暴露出诸多问题,如开发效率低、部署困难、扩展性差等。为了解决这些问题,微服务架构应运而生。本文将详细介绍微服务架构的定义、发展历史、特点、细分类型、优…...
【Kafka】消费者幂等性保障全解析
文章目录 消费者幂等性的重要性基于消息唯一标识的幂等处理消息去重表缓存去重 基于事务的幂等处理消费者事务与幂等性 幂等性保障的挑战与应对性能开销数据一致性 总结 在 Kafka 生态系统中,我们往往着重关注生产者端的幂等性,确保…...
Linux内核设计——(一)进程管理
目录 一、进程及线程简介 二、进程描述符 2.1 进程描述符简介 2.2 分配进程描述符 2.3 进程标识值 2.4 进程状态 2.5 进程上下文 三、进程创建 3.1 写时拷贝 3.2 fork()和vfork() 四、线程 4.1 Linux线程实现 4.2 内核线程 五、进程终结 5.1 删除进程描述符 5.…...
Ubuntu 22.04 LTS 下载英伟达驱动
在 Ubuntu 22.04 LTS 上安装 NVIDIA 驱动可以通过以下几种方法完成。以下是详细的步骤: 方法 1:使用 apt 包管理器安装(推荐) 这是最简单的方法,适合大多数用户。 更新系统包列表 sudo apt update检查可用的 NVIDIA 驱…...
22 安装第三方包
一、什么是第三方包 在 Python 的世界里,包就像是一个个功能强大的工具箱,它将多个 Python 模块收纳其中,而每个模块又蕴含着丰富多样的具体功能。可以说,一个包就是一系列同类功能的集合体,它们就像紧密协作的团队&a…...
深度学习deeplearn1
import torch # 导入 PyTorch 库,PyTorch 是一个用于深度学习和张量计算的强大库x torch.arange(12) # 创建一个包含从 0 到 11 的整数的一维张量 x # torch.arange 函数用于生成一个指定范围的整数序列print(x) # 打印张量 x 的内容print(x.shape) # 打印张量 x 的…...
oracle 常用函数的应用
在使用开发中会经常遇到数据类型转换、显示系统时间等情况,需要使用函数来实现。通过函数来实现业务需求会非常的省事便捷,函数可以用在适当的dml语句和查询语句中。 Oracle 数据库中主要使用两种类型的函数: (1)单行函数:对每一个…...
指纹浏览器技术解析:如何实现多账号安全运营与隐私保护
浏览器指纹的挑战与需求 在数字化运营场景中,浏览器指纹技术被广泛用于追踪用户行为。通过采集设备硬件参数(如屏幕分辨率、操作系统)、软件配置(如字体、插件)及网络特征(如IP地址、时区)&…...
“上云入端” 浪潮云剑指组织智能化落地“最后一公里”
进入2025年,行业智能体正在成为数实融合的核心路径。2025年初DeepSeek开源大模型的横空出世,通过算法优化与架构创新,显著降低算力需求与部署成本,推动大模型向端侧和边缘侧延伸。其开源策略打破技术垄断,结合边缘计算…...
CentOS 7 如何挂载ntfs的移动硬盘
CentOS 7 如何挂载ntfs的移动硬盘 前言一、查看硬盘并尝试挂载(提示无法挂载)二、yum安装epel-release提示yum被锁定三、强行终止yum的进程四、yum安装epel-release完成五、yum安装ntfs-3g六、此时可正常挂载NTFS硬盘 前言 CentOS 7默认情况下是不支持NTFS的文件系统ÿ…...
pytorch+maskRcnn框架训练自己的模型以及模型导出ONXX格式供C++部署推理
背景 maskrcnn用作实例分割时,可以较为精准的定位目标物体,相较于yolo只能定位物体的矩形框而言,优势更大。虽然yolo的计算速度更快。 直接开始从0到1使用maskrCNN训练自己的模型并并导出给C部署(亲测可用) 数据标注…...
①EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
型号 协议转换通信网关 EtherCAT 转 Modbus TCP MS-GW15 概述 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关,为用户提供一种 PLC 扩展的集成解决方案,可以轻松容易将 Modbus TCP 网络接入 EtherCAT 网络 中,方便扩展,不受限…...
Python扩展知识详解:lambda函数
目录 前言 1 基本知识点 语法 特点 代码示例 2 常见使用场景 1. 与高阶函数配合使用 2. 作为排序键来使用 3. 立即调用函数 4. 在字典中使用 3 高级用法(进阶版) 1. 多参数lambda 2. 设置默认参数 3. 嵌套lambda 注意事项 何时…...
信号量与基于环形队列的生产者消费者模型
目录 POSIX信号量 理解 使用 初始化 销毁 等待 发布信号量 基于环形队列的生产者消费者模型 POSIX信号量 理解 信号量可用于线程间的同步,它可以用于将一整块资源切成一个个的小部分以供并发访问。它实际上是一个计数器,但特别之处在于支持原子…...
