技术团队通过 GCeasy 工具分析完几千次用户上传的GC日志后, 发现一个现象: 仍然有很多Java程序传入了JVM启动参数 -XX:+UseCompressedOops
实际上,如果JVM的版本在 Java SE 6 update 23 及以上, 则不需要再设置 -XX:+UseCompressedOops 参数, 因为默认会开启。

“OOP” 表示普通对象指针(Ordinary Object Pointer), 这种指针是对某个对象的托管指针(managed pointer)。 OOP占用的空间长度通常与宿主机的原生指针(native machine pointer)一样; 也就是说, 在64位操作系统上OOP就是64位, 在32位操作系统上OOP就占32位。

由于操作系统的限制,32位版本的JVM, 内存地址空间最大只能到 4GB(2 ^ 32字节)。
如果要管理更大的内存,需要使用64位JVM。
而如果JVM使用64位OOP,则最多可以管理 18.5 Exabytes(2 ^ 64字节)。
这是一个非常大的空间。 当今世界上还没有哪台服务器有这么大的物理内存。

那么问题来了: 64位JVM上, 使用32位的压缩指针如何管理32GB内存呢?
我们可以注意到 4x8=32; 想一下, 如果内存地址使用8字节对齐(8x8=64bit), 再进行映射和换算, 是不是就可以放大8倍了?
当然, 这样处理的话, 要更精细的操作单个字节就不容易了。
想要了解JVM的内存布局和对齐机制, 可以参考: 解析一个Java对象占用多少内存空间

存储指针的内存空间放大1倍,可以定位更大的内存区域。
但这并非 “没有代价”。
从32位JVM切换到64位JVM,你会发现可用内存的消耗会变成原来的1.5倍左右, 这是因为存储地址指针的空间消耗变大了。
为了解决这个问题,JVM开发人员发明了 Compressed Oops 功能。 关于压缩指针(compressed OOPs)的详细信息请参考: HotSpot JVM Performance Enhancements

要启用这个功能,可以传入JVM启动参数 -XX:+UseCompressedOops
但从 Java SE 6U23 开始,JVM会默认开启压缩指针。
因此, 我们不需要再手动传递这个参数。

  • 原文链接: Avoid passing -XX:+UseCompressedOops
  • GitHub版本: 不需要再手工指定JVM启动参数 -XX:+UseCompressedOops
  • Gitee版本: 不需要再手工指定JVM启动参数 -XX:+UseCompressedOops

不需要再手工指定JVM启动参数-XX:+UseCompressedOops相关推荐

  1. JVM启动参数详解(含调优)

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  2. 使用-XX:+PrintCommandLineFlags展示JVM启动参数

    导语: 近期在学习周志明老师的<<深入理解Java虚拟机: JVM高级特性与最佳实践(第3版)>>, 在IDEA中测试老师的示例代码时, 发现程序的输出和老师的输出不一样, 想 ...

  3. JVM 启动参数详解:博观而约取、厚积而薄发

    JVM 作为一个通用的虚拟机,我们可以通过启动 Java 命令时指定不同的 JVM 参数,让 JVM 调整自己的运行状态和行为,内存管理和垃圾回收的 GC 算法,添加和处理调试和诊断信息等等.本节概括 ...

  4. JVM 启动参数详解

    JVM 启动参数详解 JVM 作为一个通用的虚拟机,我们可以通过启动Java命令时指定不同JVM参数,让 JVM调整自己的运行状态和行为,内存管理和垃圾回收的GC算法等等. 直接通过命令行启动 Jav ...

  5. JVM启动参数解析(转)

    JVM启动参数解析(转) (2010-03-17 19:45:19) 转载 标签: jvm 启动参数 it 分类:他山之石攻己之玉 dk1.4.2 JVM官方地址:http://java.sun.co ...

  6. JVM启动参数配置详解

    JVM启动参数配置详解 1. JDK8的JVM启动参数默认配置 2. JDK8的JVM启动参数说明 2.1 基本参数 2.2 G1相关参数 2.3 辅助信息 1. JDK8的JVM启动参数默认配置 - ...

  7. RocketMQ部署之动态设置JVM启动参数

    这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发.拒绝营销号,拒绝标题党 背景 线上的RocketMQ集群有运行一段时间了.比如测试环境和线上环境的RocketMQ集群部署的机 ...

  8. 全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  9. jvm 启动参数设置

    -Xms256m -Xmx256m -XX:MaxPermSize=64m 如果 jvm 启动失败, 说堆内存不够, 需要调小 初始堆和最大堆大小, 持久代大小: 第一行的参数是调节后的vm参数荔枝 ...

最新文章

  1. 微信小程序的省市区三级地址mysql_微信小程序picker实现的省市区三级联动
  2. 8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
  3. windows API(一)
  4. android ext3 格式化,怎样将TF卡格式化为EXT分区?
  5. 1、MySQL为什么需要事务?
  6. 【IDEA】IDEA中使用git将项目上传到码云上
  7. phpVX活码系统源码
  8. 有关mysql的开发介绍_深入浅出MySQL之开发篇(二)
  9. Ubuntu 20.04 LTS 开发周期的重要任务:移除 Python 2
  10. 计算机电路板工作原理,充电宝电路板原理图的说明
  11. linux for java programer
  12. Java MMdd 日期格式转换问题
  13. android设置传感器的采集方向,Android-传感器开发-方向判断
  14. Linux下只允许用户远程scp
  15. 0xffffffff是多少?
  16. Go入门案列1:实现一个家庭收支记账系统
  17. onsubmit和submit事件处理函数怎么不生效呢?
  18. CAD版本转换怎么转?
  19. 我做淘宝7年的工作经验总结
  20. 【项目】不用数据库实现留言板(用本地文件)

热门文章

  1. 2022年中国企业数字化转型白皮书 附下载
  2. 小程序页面跳转传递对象
  3. 【kubeadm】init配置文件
  4. 大话手机处理器-世界上最复杂的芯片
  5. Spring对事务的操作
  6. 《CODE COMPLETE 2(代码大全2)》警句
  7. 「PS技巧」教你如何快速抠取红色合同印章,大兵SEO博客
  8. php rand 重复,php如何使用rand生成不重复随机数
  9. exchange设置收发邮件大小
  10. Collecting Bugs(解决bug)