首页 > 代码库 > Java虚拟机的内存模型

Java虚拟机的内存模型

一、问题起源

  这篇文章的起源其实是博主想要学习Java并发,计算机并发的痛点在于一方面cpu越来越多核化,另外

一个方面就是cpu和存储以及通信子系统的速度差距太大,大概来说,cpu速度是ns级,内存100ns,硬盘ms,内存比cpu慢100倍,

硬盘比cpu慢100万倍,cpu如果-等这些速度慢的多的小伙伴,势必造成计算资源的浪费。物理机为了解决cpu与内存的速度差,

在两者之间加入了缓存,有缓存就会引入新问题,即缓存一致性问题。

技术分享

      图1(图片来自参考文献【1】)

  为了解决缓存一致性问题,各个cpu在访问缓存和主内存时需要遵守一定的缓存一致性协议,

把对特定的内存和缓存的访问过程抽象出来,就称之为“内存模型”。

二、JVM的内存模型

  如下图所示,与物理机中cpu访问内存的结构类似,JVM内存模型中,所有变量都存储在主内存(Main Memory)

每条线程有自己的工作内存(Working Memory),变量在不同线程间的传递需要通过主内存。

技术分享

 

       图2(图片来自参考文献【1】)

  如上所述,变量在线程间的传递需要工作内存和主内存间的交互。这种交互要遵循一定的一致性协议。

这里简单称为“交互协议”,交互协议具体体现为8中原子操作和一些操作规则,如下:

>8中原子操作

  1. lock:作用于主内存的变量,把一个变量标识为一条线程独占的状态;
  2. unlock:作用于主内存的变量,把一个变量从一条线程独占的状态释放出来,释放后的变量才可以被其他线程上锁;
  3. read:作用于主内存的变量,把一个变量从主内存传输到线程的工作内存,这一步仅仅是传输动作;
  4. load:作用于工作内存的变量,把read中传输过来的变量放入工作内存的副本中;
  5. use:作用于工作内存的变量,把工作内存中的一个变量传递给执行引擎,即线程在读取变量的值;
  6. assign:作用于工作内存的变量,把一个从执行引擎接收到的值赋给工作内存的变量,即线程在写变量的值;
  7. store:作用于工作内存的变量,把一个变量的值传输到主内存,这一步仅仅是传输动作;
  8. write:作用于主内存的变量,把store过来的变量值放入主内存的变量中。

>操作规则

未完待续。。。

参考文献:

【1】深入理解Java虚拟机 by 周志明

【2】Java并发编程实战 机械工业出版社2012

 

Java虚拟机的内存模型