`

JVM优化之压缩普通对象指针(CompressedOops)

    博客分类:
  • JVM
jvm 
阅读更多
通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。
对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。
幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数。
什么是 OOP ?

OOP = “ordinary object pointer” 普通对象指针。

启用CompressOops后,会压缩的对象:
? 每个Class的属性指针(静态成员变量)
? 每个对象的属性指针
? 普通对象数组的每个元素指针

当然,压缩也不是万能的,针对一些特殊类型的指针,JVM是不会优化的。
比如指向PermGen的Class对象指针,本地变量,堆栈元素,入参,返回值,NULL指针不会被压缩。
CompressedOops的原理

原理,解释器在解释字节码时,植入压缩指令(不影响正常和JVM优化后的指令顺序)。
具体逻辑是,当对象被读取时,解压,存入heap时,压缩。

压缩指令伪码

    ! int R8; oop[] R9; // R9 is 64 bits
    ! oop R10 = R9[R8]; // R10 is 32 bits
    ! load compressed ptr from wide base ptr:
    movl R10, [R9 + R8<<3 + 16]
    ! klassOop R11 = R10._klass; // R11 is 32 bits
    ! void* const R12 = GetHeapBase();
    ! load compressed klass ptr from compressed base ptr:
    movl R11, [R12 + R10<<3 + 8]

零基压缩优化(Zero Based Compressd Oops)

零基压缩是针对压解压动作的进一步优化。
它通过改变正常指针的随机地址分配特性,强制从零开始做分配(需要OS支持),进一步提高了压解压效率。

要启用零基压缩,你分配给JVM的内存大小必须控制在4G以上,32G以下。
如果小于4G,那么JVM会使用低虚拟地址空间(low virutal address space,64位下模拟32位),这样就不需要做压解压动作了。
而对于大于32G,将采用默认的随机地址分配特性,进行压解压。
适用场景

CompressedOops,可以让跑在64位平台下的JVM,不需要因为更宽的寻址,而付出Heap容量损失的代价。
不过,它的实现方式是在机器码中植入压缩与解压指令,可能会给JVM增加额外的开销。

转载请注明原文链接:http://kenwublog.com/compressedoops
分享到:
评论

相关推荐

    淘宝JVM优化实践-长仁.pdf

    《淘宝JVM优化实践》是一份深入探讨阿里巴巴集团核心系统研发部在JVM优化方面的实践经验的文档。这份文档主要涵盖了以下几个关键知识点: 1. **淘宝JVM优化背景**:随着淘宝、天猫等业务的快速发展,其Java应用规模...

    JVM优化方法

    JVM优化方法

    JVM笔记资料压缩文件

    jvm笔记 1、jvm总体架构.pdf 2、堆内存内部结构.pdf 3、有关内存的常用配置参数.pdf 4、有关内存溢出和内存泄漏的...6、jvm优化知识点升级和配置总结.pdf 7、Tomcat调优实战.pdf 8、动态查看JVM内存的工具.pdf

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G)

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G) 〖课程介绍〗: 来自顶尖大厂的架构师级JVM优化与GC调优策略实战课程,是具备有尖端技术的优化课程。在课程内容上几乎不用过多的介绍,单是查阅目录就...

    JVM优化方案

    其他的JVM参数如`-XX:SurvivorRatio`、`-XX:MaxTenuringThreshold`等则与对象晋升策略有关,它们会影响新生代和老年代之间的数据流动。`-XX:+UseFastAccessorMethods`启用原始类型访问的优化,`-XX:+...

    JVM性能优化(PPT)

    **JVM性能优化** 在Java开发中,JVM(Java Virtual Machine)是至关重要的组成部分,它负责运行所有的Java应用程序。JVM性能优化是一项细致而关键的任务,能够显著提升程序的运行效率,减少资源消耗,提高系统稳定...

    jvm优化中文版

    为了深入理解JVM优化的相关知识点,我们可以从多个角度来探讨。首先,需要理解JVM(Java虚拟机)的基本概念,以及在性能调优中的关键作用。JVM是运行Java程序的核心组件,负责解释Java字节码,并将字节码转换成特定...

    jvm初识及JIT优化

    jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识及JIT优化jvm初识...

    jvm优化参数配置

    在Java应用服务器中,尤其是Tomcat这样的轻量级应用服务器,JVM(Java虚拟机)的性能优化至关重要。"jvm优化参数配置"是确保Tomcat稳定运行的关键环节,能够提高应用的响应速度,减少内存泄露,提升系统整体性能。...

    JVM优化|java虚拟机优化

    - 了解下我们为什么要学习JVM优化 - 掌握jvm的运行参数以及参数的设置 - 掌握jvm的内存模型(堆内存) - 掌握jamp命令的使用以及通过MAT工具进行分析 - 掌握定位分析内存溢出的方法 - 掌握jstack命令的使用 - 掌握...

    jvm优化详解

    JVM优化详解涉及的是Java虚拟机(Java Virtual Machine)的性能调优,这是Java应用性能提升的一个重要方面。JVM是运行Java字节码的抽象计算机,其性能优化对于提高Java应用程序的执行效率至关重要。下面我们来详细...

    jvm详细介绍以及性能优化方法

    优化Tomcat涉及多个方面,包括调整连接器配置(如最大连接数、超时时间)、线程池设置、Web应用的部署优化(如减少session使用、压缩响应内容)以及启用HTTP/2协议等。此外,监控Tomcat的运行状态,如CPU使用率、...

    JVM性能优化笔记

    JVM性能优化笔记 ------------------------------------------

    JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).pdf

    本篇文件内容主要介绍了JVM优化的第三部分,重点围绕Tomcat参数调优、JVM参数调优、JVM字节码优化以及代码优化等几个方面。下面是针对这些知识点的详细解释: 1. Tomcat参数调优 在Tomcat参数调优部分,首先介绍了...

    JVM优化/Tomcat优化/mysql优化-某学院VIP教程

    1 什么是性能优化\ 2 性能测试与优化\ 3 性能优化JVM篇\ 4 性能优化Tomcat篇\ 5 性能优化mysql篇\

    JVM参数优化及JVM解析.docx

    总之,理解和掌握JVM参数优化、运行时数据区的结构以及垃圾回收机制,是每个Java开发者提高应用性能、避免内存泄漏和优化系统资源利用率的关键。通过细心的调整和不断的实践,可以打造出更加高效稳定的Java应用程序...

    java jvm及性能优化_javajvm优化_Java性能分析_

    JVM性能优化是提升Java应用效率的关键环节,涉及到内存管理、垃圾回收、线程调度等多个方面。以下是对"Java JVM及性能优化"和"Java性能分析"的详细阐述: 一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保...

    Jboss_JVM优化

    1. JVM内存结构优化 JVM内存主要分为堆内存(heap)和非堆内存(nheap)。堆内存主要包括Eden空间、Survivor空间和Tenured空间。Eden空间用于对象的创建,当Eden空间不足时,会触发Minor GC(小垃圾收集),将无效...

Global site tag (gtag.js) - Google Analytics