JVM 内存模型(一)

Java 内存模型

参考:《深入理解Java虚拟机》-jvm高级特性与最佳实现(周志明著)

一、前言

多任务处理是现代计算机操作系统中一项必备的功能,不仅仅是因为计算机的运算能力强大了,还有一个原因是因为计算机的运算速度与它的存储和通信子系统速度差距太大,大量的时间耗费在磁盘I/O,网络通信或者数据访问上,如果不希望处理器大部分时间里都在等待其他资源的状态,就必须使用一些手段把处理器的运算能力压榨出来。

另外一个服务端为多个客户端提供服务则是另一个更加具体的并发应用场景,衡量一个服务性能好坏的一个重要中准就是TPS(Transactionas Per Second),它代表着一秒内服务端平均能响应的请求总数。

如上两个引子衍生出Java 中多线程和并发可能遇到的一些问题,我们先了解物理计算机的并发问题。

二、物理计算机的内存模型

2.1、引入:因为计算机的运算任务不可能只靠处理器“计算”来完成,处理器至少要与内存交互,比如读取运算数据,存储运算结果等,这个I/O的操作是很难消除的,由于计算机的处理器与存储设备的运算速率相差几个数量级,所以现现代的计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内侧和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能更快地进行,当运算结束后再从缓存中同步写回内存。这样处理器就无须等待缓慢的内存读写了。

2.2、基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来了更高的复杂度。因为引入了一个新的问题:缓存一致性的问题(在多处理器系统中,每个处理器都有自己的高速缓存,而他们又共享一块主存。当多个处理器的运算任务都涉及到同一块主存区域时,将可能导致各自缓存的数据不一致,那么写回主内存的数据以谁的数据为准呢?为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来操作。)

内存模型可以理解为是在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象,不同架构的物理机可以拥有不一样的内存模型。Java虚拟机也有自己的内存模型

除了增加高速缓存之外,为了使得处理器内部的运算大暖能尽量被充分利用,处理器可能会对输入代码进行乱序执行优化,处理器会在乱序执行后对结果进行重组。Java虚拟机的即时编译器也有类似的指令重排序优化功能。

三、Java虚拟机的内存模型

Java虚拟机规范中试图定义一种Java内存模型来屏蔽各种硬件和操作系统的内存访问差异,从而实现Java程序在不同平台,不同操作系统下达到一致的内存访问效果。

定义Java内存模型并非一件简单的事情,这个模型必须定义得足够严谨,才能让Java的并发内存访问不会产生歧义,但是也必须定义的足够宽松,是的虚拟机的实现有足够的自由空间去利用硬件的各种特性来获取更好的执行速度。

3.1、主内存与工作内存:Java内存模型的主要目标是定义程序中各个变量的访问规则,也就是虚拟机中将变量存储到内存和从内存中取出这样的底层细节的约定。这里的变量与Java编程中的变量有所区别,他包括了实例字段,静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的。不会被共享,自然就不会存在竞争问题。

Java内侧模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时的主内存名字一样,两者也可以相互类比,但是此处是虚拟机内存的一部分)。每条线程都有自己工作内存(Working Memory,可以与之前提及的高速缓存类比),线程的工作内存中保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作(包括读取,赋值),必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程之间变量的传递必须通过主内存来进行,线程,主内存,工作内存三者的交互关系如下所示。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值