JVM内存模型

来源:互联网 发布:php 会员权限 编辑:程序博客网 时间:2024/06/10 05:15

物理缓存篇

虽然基于高速缓存的存储交互很好的解决了处理器和内存之间的矛盾,也引入了新的问题:缓存一致性问题,在多核处理器系统中,每个处理器有自己的高度缓存,却共用一个内存的情况下,则很有可能出现缓存不一致的现象,为了解决这个问题,处理器的运行需要遵循一些协议,在运行时需要将这些协议保证数据的一致性。协议包括了MSI/MESI/MOSI/SYNAPSE/FIRELY/DRAGON PROTOCOL等。

JVM发展历史篇

1996年1月23日Sun公司发布了JDK1.0,他就是java首次首次正式运行环境,JDK所带的虚拟机就是 Classic VM,它是能使用纯解释器的方式来执行java代码。HotSpot VM ,它是Sun JDK 和OpenJDK中所带的虚拟机,也是目前使用最广泛的jvm。基于android来讲,它是最热门的移动数码平台在这几年中的发展超过了JAVA ME在过去10多年所获得成果。Dalvik VM是Android平台的核心组成部分之一,它并不是一个JAVA虚拟机,也没有遵循Java虚拟机规范,也不能直接执行Java的Class文件,DVM使用的寄存器架构,而不是JVM常见的栈架构。虽然这么说,它又和java有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法来编写的应用程序,并且可以直接使用大部分的Java API。

java的基本介绍

JAVA5对Java语法进行了一次扩充,加人了自动封箱,泛型,动态注解,枚举,可变长参数,遍历循环等语法。Java退出的64位虚拟机,但是静侧重测试,发现其比32位增加了10%·30%的内存消耗。

虚拟机篇

虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致。Java中通过多项城机制使多个任务同时执行处理,所有的线程共享JVM内存区域的main memory,而每个线程又有自己单独的工作没存,当线程与内存区域进行交互时,数据从主内存拷贝到工作内存,进而交由线程处理(操作码+操作数)。下面为jvm逻辑内存模型(内存区分布)

jvm逻辑内存模型

介绍上图:1、程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选去下一条需要执行的字节码指令,如:分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。Java虚拟机的多线程是通过线程的轮流切换并分配处理器执行的时间来实现的,在任何一个的确定的时刻,一个处理器只会执行一条线程中的指令。为了保证线程的切换能够恢复到正确的执行位置,每条线程都要有自己独立的程序计数器,各条线程之间计数器互相不影响,独立存储,称这个内存区域为线程私有的内存。如果线程正在执行一个java方法,这个计数器记录的正式执行的虚拟机字节码指令的地址如果执行的Native方法,这个计数器值为空(Undefined),此内存区域是唯一衣蛾在Java虚拟机规范中没有任何oom的情况区域。2、Java虚拟机栈    与程序计数器一样,Jvm栈也是线程私有的,它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈。    虽然常把java内存分为栈和堆内存,这样的分法比较粗糙。    栈,就是虚拟机栈,或者说是虚拟机栈中局部变量的表部分。    局部变量表存放了编译期可知的各种数据类型,对象引用类型(reference类型,它不等同于对象本身,可是一个指向对象起始地址的引用指针,也可是指向衣蛾代表对象的句柄或其他于此对象相关的位置),和return Address类型(指向了一条字节码指令的地址)。    其中64位长度long和double类型数据将会占用2个局部变量空间(Slot),其余的数据类型只会占用1个。局部变量表所需的内存空间在编译期键完成分配,当进入一个方法是,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间,不会改变局部变量表的大小。    异常情况:    1、如果线程请求的栈深度大于虚拟机所允许的深度,将会出先StackOverflowError    2、如果虚拟机栈可动态扩展(大部分的java虚拟机都可动态扩展,不过java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展是无法申请到足够的内存,出现oom异常。3、本地方法栈    Native Method Stack 与虚拟机所发挥的作用是非常相似的,区别就是虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。4、Java堆    对大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块,Java堆被所有线程共享的一块内存区域,在虚拟机启动时创建,堆的唯一目的就是存放对象的实例!,几乎所有的对象实例都在这里被分配内存    其规范中描述:所有对象的实例,以及数组都在堆上进行分配。    Java堆也是垃圾收集器管理的主要区域,被称为GC堆,Java堆还可以分为新生代和老年代,有Eden空间,From Survivor空间,有 To Survivor空间等。    如果从内存分配的角度来看,线程共享的Java
原创粉丝点击