内存模型—软件硬件结合讲JVM内存模型

转载 2016年05月30日 12:41:48

      JVM是一个完整的计算机模型。侧重理解JVM的内存模型规定如何和何时可以看见由其他线程修改后的共享变量的值,以及如何在必要的时候如何同步的访问共享变量。

      JVM内部原理:


       划分为栈和堆(还有其他的,现只关注这两个)。每个运行在Java虚拟机里的线程都拥有自己的线程栈,这个线程栈包含了这个线程调用的方法当前执行点的相关信息。一个线程只能访问自己的线程栈,一个线程栈创建的局部变量对其他线程不可见。即使两个线程执行同样的代码,这两个线程仍然在自己的线程栈中的代码来创建局部变量。

      所有基本类型的局部变量都存放在栈中,故对其他线程不可见,一个线程能向另一个线程传递一个基本类型的拷贝,但始终不能共享基本变量自身。

      堆上包含在Java程序中创建的所有对象,无论是那一个对象创建的,包括基本类型的包装。如果一个对象被创建然后赋值给一个局部变量,或作为成员变量,都是放在堆上的。

      一个局部变量是基本类型,呆在栈上。若是引用类型,则引用在栈上,对象本身在堆上。

      对象:对象的成员变量随着这个对象自身存放在堆上,不论是基本还是引用类型。对象的方法包含的局部变量存放在栈上。

      静态成员变量随着类定义一起放在堆上。

两个线程访问同一个对象,也能访问这个对象的成员变量。如果调用同一个方法,都会访问到对象的成员变量,但是每个线程都拥有这个局部变量的私有拷贝。???(两个线程访问同一个对象的成员变量,得到的是拷贝)

      硬件内存架构:


      现代硬件内存模型与Java内存模型有一些不同。现代计算机通常由两个或者多个CPU。其中一些CPU是多核,从这点可以看出在一个有两个或者多个CPU的现代计算机同时运行多个线程是可能的。意味着Java程序每个CPU上一个线程可能同时(并发)执行。

       每个CPU内都包含一系列的寄存器,是CPU内存基础。每个CPU可能还有一个或者多个CPU缓存层。计算机还有主存。访问速度从大到小:寄存器>缓存>主存。

       当CPU需要读取主存时,会将主存的部分读至CPU的缓存中,甚至可能将缓冲中的部分内容读至寄存器中,然后再寄存器中执行操作。当CPU需要将结果写回到主存中时,它会将内部寄存器的值刷新到缓存中,再在某时刻刷新回主存;当CPU需要在缓存层存放东西时,存放在缓存中的内容通常会被刷新会主存。CPU缓存可以在某一时刻将数据局部写到内存中,和在某一时刻局部刷新它的内存。它不会在某一时刻读写整个缓存。

       桥接JVM与硬件

       硬件架构没有区分栈和堆,对于硬件所有的栈和堆都分布在主存中,部分栈和堆可以出现在CPU缓存和寄存器中。

       当对象和变量被存放在计算机中各个不同的内存区域中时,主要会出现两方面的问题:1.线程对共享变量修改的可见性;2.读、写、检查共享变量时出现race condition。

      1.volatile可以保证直接从主存中读取一个变量,如果变量修改后,总是会被写回主存中去。

      2.使用同步块。一个同步块可以保证在同一时刻仅有一个线程可以进入代码的临界区。同步块还可以保证代码块中所有被访问的变量将会从主存读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去。

相关文章推荐

JVM内存模型

JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 程序计数器 ...

JVM初探 -JVM内存模型

JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时间研读了几本评价较高的JVM入门书籍, 算是总结...

JVM内存模型和垃圾收集

看《深入理解Java虚拟机》,所作读书笔记。 一、JVM体系结构 二、JVM运行时数据区 堆的划分 三、对象是否可以回收 1、引用计数算法 2、可达性分析算法 GC Roots的对象包括以...

JVM内存模型,以及JVM性能调优

转载批注:最近因与别人讨论问题时,问到JVM内存模型,但是苦于只知道JVM的大概内容,不知道详细,也罢,近期会逐渐有充足的自己的时间,好好整理学习学习。以下内容为转载别人的资料,个人认为写的很好,就全...
  • xzknet
  • xzknet
  • 2015年03月11日 12:03
  • 3190

JVM内存模型及分区

Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间。 jvm管理的内存区域包括以下几个区域: 栈区: 栈分为java虚拟机栈和本...

JVM内存模型及垃圾回收机制

JVM内存模型 1、栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。存储局部变量、引用、方法、返回值等。 StackOverflowError:如果在线程执...

深入理解JVM(一)——JVM内存模型

JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. ...

JVM内存模型及垃圾回收算法

JVM内存模型总体架构图及垃圾回收算法

jvm内存模型和内存分配

jvm内存模型和内存分配 1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包...

JVM内存模型以及HotSpot的GC策略

本文描述了JVM的内存模型定义、Java自动内存管理概念、以及Oracle官方虚拟机HotSpot在内存管理方面的实现。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存模型—软件硬件结合讲JVM内存模型
举报原因:
原因补充:

(最多只允许输入30个字)