保证指令的有序性
cpu有时为了提高效率会乱序执行指令.但是有的时候会因为乱序而导致异常
x86 CPU 内存屏障
- sfence: 在sfence指令前的写操作必须在sfence指令后的写操作,之前完成
- lfence: 在lfence指令前的读操作必须在lfence指令后的读操作,之前完成
- mfence: 在mfence指令前的 读写 操作必须在mfence指令后的 读写 操作,之前完成
jvm级别 内存屏障
jvm 的内存屏障依赖于cpu硬件支持
- LoadLoad
- StoreStore
- LoadStore
- StoreLoad
volatile 底层实现
- 字节码层面: 被标记了volatile的变量在被翻译成字节码文件的时候也就是加了一个 VOLATILE的标记
- jvm层面:
- OS和硬件层面
根据cpu不同而不同
synchronize 底层实现
- 字节码层面 synchronize 代码块 增加了 monitorenter 和 monitorexit 指令
- jvm 层面 c 和 c++ 调用操作系统的同步机制
- 硬件层面 lock指令
对象的内存布局
java 内存模型
对象的创建过程
- classLoading
- classLinking (verification 校验合法性, preparation 把静态类变量赋初始值, resolution 解析)
- class initializing 静态变量赋 默认值, 执行静态代码块
- 申请对象内存
- 成员变量赋初始值
- 调用构造方法 : 成员变量赋 默认值
对象在内存中的存储布局
普通对象
- 对象头 markword 8 字节
- classpointer 开启压缩为4字节,不开启为8字节
- 实例数据, 开启压缩参数 引用类型4字节,不开启8字节
- padding 对其
数组对象
相比普通对象还多一个数组长度
对象头具体包括什么
- 锁定信息, 表示该对象是否被 synchronize 锁定
- 分代的年龄