深入浅出JVM之调优(二)

358 阅读2分钟

对象

对象的创建过程

classLoad->Linking(校验,准备,解析)->init->开辟空间->成员变量赋于默认值->调用构造函数(成员变量顺序赋值,执行构造方法语句)

对象的大小

普通对象

  • markword: 8个字节
  • classPointer: -XX:+UseCompressedClassPointers 为4字节 不开启为8字节
  • 实例数据: 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops Ordinary Object Pointers
  • padding: 8的倍数

数组对象

  • markword: 8个字节
  • classPointer: -XX:+UseCompressedClassPointers 为4字节 不开启为8字节
  • 数组长度:4字节
  • 数组数据
  • padding: 8的倍数

对象头具体包括什么

一般普通对象几个重要的点,hashCode 31bit,偏向锁标记1bit,锁标记2bit 偏向锁标记1:偏向锁 0:无锁 锁标记:01:无锁 00:轻量锁 10:重量锁 11:gc标记 注意不同的状态下属性是不一样的,下面来个图大家看一下

对象头介绍补充:java对象头信息

Runtime Data Area

PC-程序计数器

每个线程都有一个自己的pc,负责记录线程内字节码指令执行的位置,是线程私有的,占用空间很小。

JVM Stack-Java虚拟机栈

线程私有.

  1. Frame - 每个方法对应一个栈帧
    1. Local Variable Table

    2. Operand Stack 对于long的处理(store and load),多数虚拟机的实现都是原子的 jls 17.7,没必要加volatile

    3. Dynamic Linking blog.csdn.net/qq_41813060… jvms 2.6.3

    4. return address a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。

heap-Java堆

java堆的特点是消耗内存大,线程共享,作用是存储对象的实例,最常见的问题就是GC问题,堆内存不足以分配对象时会发生OOM问题

Method Area-方法区

Meta Space (>=1.8) 方法区于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据,根据他存储的信息可以推断出特点是线程共享,垃圾回收效果较差。

Direct Memory-直接内存

JVM可以直接访问的内核空间的内存 (OS 管理的内存). NIO , 提高效率,实现zero copy