对象
对象的创建过程
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虚拟机栈
线程私有.
- Frame - 每个方法对应一个栈帧
-
Local Variable Table
-
Operand Stack 对于long的处理(store and load),多数虚拟机的实现都是原子的 jls 17.7,没必要加volatile
-
Dynamic Linking blog.csdn.net/qq_41813060… jvms 2.6.3
-
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