为什么要学习
我们为什么要学习jvm?給大家一个代码列子,说明一下
public class CatTest {
public CatTest() {
Object t=new Object();
}
}
接下来执行javac CatTest.java 后面调用javap -v CatTest.class
这里可以看出Object t=new Object(),这代码执行了好多个jvm指令码,但是学过操作系统的肯定知道,cpu执行指令有可能是乱序的,是不是我们的代码就乱了?单线程结果一般都是正确的,但是多线程情况下有可能出问题,但是Java也给我们提供了一些工具,去保证在多线程数据的安全性。
硬件层基础
存储器的层次结构
如何保证数据一致性
- 总线锁: 使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。
- MESI Cache缓存一致性协议
- 每个cache line标记四种状态(invaild、exclusive、modified、shard)
- 大家可以参考一下别的文章,会理解的更透彻点。
缓存行
- Cache 中的数据是按块读取的,当CPU访问某个数据时,会假设该数据附近的数据以后会被访问到,因此,第一次访问这一块区域时,会将该数据连同附近区域的数据(共64字节)一起读取进缓存中,那么这一块数据称为一个Cache Line 缓存行。
- 缓存系统是以缓存行为单位存储的。目前主流的CPU Cache的Cache Line大小都是64字节。
执行顺序
如何保证特定情况下有序执行:
cpu内存屏障