初识HotSpot及指针压缩 - hotspot篇

VM选项

  • 基本配置类:对虚拟机主要组件或策略的配置或选择,如Java堆的大小、垃圾收集器的选择、编译模式的选择等。举例来说,-agentlib 选项用来加载本机代理库; -Xint 配置虚拟机以纯解释模式运行,-Xmixed 以解释器+即时编译混合模式运行; -Xmx 配置最大Java堆大小; -XX:UseG1GC配置 G1收集器等。
  • 调优类:对虚拟机组件或策略进行较为细致的配置,往往是尝试对虚拟机调优的重要参数。主要集中在-XX选项。如-XX:ThreadStackSize 选项允许自定义线程栈大小。
  • 性能监控类:开启监控选项,当虚拟机运行状态符合预定条件时,能够将相关信息输出以便定位问题。如使用-Xloggc选项运行系统记录GC事件,即我们常说的GC日志;-XX:ErrorFile选项可以配置当虚拟机遇到内部错误(JVM Crash) 时,可以将错误日志写入文件,文件名格式默认为hs. err_ pid .log.
  • 内部校验类:增强虚拟机内部过程校验。如开启-Xcheck:jni选项,虚拟机内部将对JNI函数进行额外的校验; -XX:ImplicitNullChecks 和-X:ImplicitDiv0Checks 选项使虚拟机内部加强对空值和除零行为的校验。额外的内部校验在牺牲少量系统性的前提下增强了系统的健壮性。
  • 调试和跟踪类:对虚拟机内部过程进行跟踪调试并输出跟踪日志,主要由一些-XX选项组成。这类选项一般在product 版中是受限的,仅在debug版或fastdebug 版中彩允许使用,一般用作了解虛拟机的重要工具。

指针压缩

对象

未开启压缩

# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     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)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

开启压缩

# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     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)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

数组

开启压缩

# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

[Ljava.lang.Object; object internals:
 OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
      0     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)                           f5 22 00 f8 (11110101 00100010 00000000 11111000) (-134208779)
     12     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
     16    20   java.lang.Object Object;.<elements>                        N/A
     36     4                    (loss due to the next object alignment)
Instance size: 40 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

未开启

# Objects are 8 bytes aligned.
# Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

[Ljava.lang.Object; object internals:
 OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
      0     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)                           c8 dc 96 1b (11001000 11011100 10010110 00011011) (462871752)
     12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
     16     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
     20     4                    (alignment/padding gap)                  
     24    40   java.lang.Object Object;.<elements>                        N/A
Instance size: 64 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total

ArrayList初始化过程(汇编码):

 3 dup
//压入8个大小容量到栈中
 4 bipush 8
 //调用实例构造方法初始化容器
 6 invokespecial #3 <java/util/ArrayList.<init>>
 9 astore_1
10 getstatic #4 <java/lang/System.out>
13 invokestatic #5 <org/openjdk/jol/vm/VM.current>
16 invokeinterface #6 <org/openjdk/jol/vm/VirtualMachine.details> count 1
21 invokevirtual #7 <java/io/PrintStream.println>
24 getstatic #4 <java/lang/System.out>
27 aload_1
28 invokestatic #8 <org/openjdk/jol/info/ClassLayout.parseInstance>
31 invokevirtual #9 <org/openjdk/jol/info/ClassLayout.toPrintable>
34 invokevirtual #7 <java/io/PrintStream.println>
37 return

开启压缩:
java.util.ArrayList object internals:
 OFFSET  SIZE                 TYPE DESCRIPTION                               VALUE
      0     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)                           22 2f 00 f8 (00100010 00101111 00000000 11111000) (-134205662)
     12     4                  int AbstractList.modCount                     0
     16     4                  int ArrayList.size                            0
     20     4   java.lang.Object[] ArrayList.elementData                     [null, null, null, null, null, null, null, null]
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total 

未开启压缩:
java.util.ArrayList object internals:
 OFFSET  SIZE                 TYPE DESCRIPTION                               VALUE
      0     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 b3 b4 1b (00010000 10110011 10110100 00011011) (464827152)
     12     4                      (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
     16     4                  int AbstractList.modCount                     0
     20     4                      (alignment/padding gap)                  
     24     4                  int ArrayList.size                            0
     28     4                      (alignment/padding gap)                  
     32     8   java.lang.Object[] ArrayList.elementData                     [null, null, null, null, null, null, null, null]
Instance size: 40 bytes
Space losses: 8 bytes internal + 0 bytes external = 8 bytes total

运行时数据区

  • 堆:分配Java对象和数组空间
  • 方法区(非堆 Non-Heap):存储类元数据,位于永久代
    • 常量池
    • 方法数据
    • 方法和构造函数的字节码
    • 类、实例、接口初始化时用到的特殊方法
  • 栈(虚拟机栈):线程栈
  • PC寄存器(Program Counter 程序计数器):存储执行指令的内存地址

堆与方法区所有线程共享,由JVM负责管理。内存分配由HotSpot内存管理模块负责,内存释放由垃圾收集器自动完成。

栈和PC寄存器线程私有,线程执行的工作场所。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红蜘蛛K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值