JVM组成部分以及内存模型

一、JVM的组成部分

我们先把JVM这个虚拟机实现机制画出来,例如以下图所看到的:

从这个图中能够看到,JVM是执行在操作系统之上的,它与硬件没有直接的交互。

我们再来看下JVM有哪些组

成部分,例如以下图所看到的:

1、 Class Loader 类载入器

类载入器的作用是载入类文件到内存,比方编写一个HelloWord.java程序,然后通过javac编译成class文件。

那怎么才干载入到内存中被运行呢?Class Loader承担的就是这个责任。那不可能随便建立一个.class文件就能

被载入的,Class Loader载入的class文件是有格式要求。在《JVM Specification》中式这样定义Class文件的

结构:

ClassFile {

u4 magic;

u2 minor_version;

u2 major_version;

u2 constant_pool_count;

cp_infoconstant_pool[constant_pool_count-1];

u2 access_flags;

u2 this_class;

u2 super_class;

u2 interfaces_count;

u2 interfaces[interfaces_count];

u2 fields_count;

field_info fields[fields_count];

u2 methods_count;

method_info methods[methods_count];

u2 attributes_count;

attribute_info attributes[attributes_count];

}

友情提示:Class Loader仅仅管载入,仅仅要符合文件结构就载入,至于说能不能执行,则不是它负责的,那是

由Execution Engine负责的。

2、 Execution Engine 运行引擎

运行引擎也叫做解释器(Interpreter),负责解释命令。提交操作系统运行。

3、Native Interface本地接口

本地接口的作用是融合不同的编程语言为Java所用。它的初衷是融合C/C++程序。Java诞生的时候是C/C++横行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码。它的详细做法是Native Method Stack中登记native方法。在Execution Engine运行时载入native libraies。眼下该方法使用的是越来越少了,除非是与硬件有关的应用,比方通过Java程序驱动打印机。或者Java系统管理生产设备。在企业级应用中已经比較少见,由于如今的异构领域间的通信非常发达,比方能够使用Socket通信。也能够使用Web
Service等等,不多做介绍。

4、 Runtimedata area执行数据区

执行数据区是整个JVM的重点。我们全部写的程序都被载入到这里,之后才開始执行,Java生态系统如此的繁荣。得益于该区域的优良自治。以下会具体介绍。整个JVM框架由载入器载入文件,然后执行器在内存中处理数据。须要与异构系统交互是能够通过本地接口进行,这样构成了一个完整的系统。

二、 JVM的内存管理

全部的数据和程序都是在执行数据区存放,它包含下面几部分:

1、Stack 栈

栈也叫栈内存。是Java程序的执行区,是在线程创建时创建,它的生命期是尾随线程的生命期,线程结束栈内

存也就释放,对于栈来说不存在垃圾回收问题,仅仅要线程一结束。该栈就Over。问题出来了:栈中存的是那些

数据呢?又什么是格式呢?

栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和执行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法。于是产生栈帧F2也被压入栈,执行完成后。先弹出F2栈帧,再弹出F1栈帧,遵循“先进后出”原则。

那栈帧中究竟存在着什么数据呢?栈帧中主要保存3类数据:本地变量(Local Variables),包含输入參数和输出參数以及方法内的变量。栈操作(Operand Stack),记录出栈、入栈的操作。栈帧数据(Frame Data),包含类文件、方法等等。光说比較枯燥,我们画个图来理解一下Java栈。例如以下图所看到的:

图示在一个栈中有两个栈帧,栈帧2是最先被调用的方法,先入栈,然后方法2又调用了方法1,栈帧1处于栈顶的位置,栈帧2处于栈底。运行完成后,依次弹出栈帧1和栈帧2,线程结束,栈释放。

2、 Heap 堆内存

一个JVM实例仅仅存在一个堆类存。堆内存的大小是能够调节的。

类载入器读取了类文件后,须要把类、方法、

常变量放到堆内存中,以方便运行器运行。堆内存分为三部分:

(a)Permanent Space 永久存储区

永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运

行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用

的内存。

(b)Young Generation Space 新生区

新生区是类的诞生、成长、消亡的区域,一个类在这里产生。应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分:伊甸区(Eden space)和幸存者区(Survivor pace)。全部的类都是在伊甸区被new出来的。幸存区有两个: 0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸园的空间用完时。程序又须要创建对象。JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其它对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存0区。

若幸存0区也满了。再对该区进行垃圾回收,然后移动到1区。那假设1区也满了呢?再移动到老年代。

(c)Tenure generation space 老年代

养老区用于保存从新生区筛选出来的JAVA对象。一般池对象都在这个区域活跃。

三个区的示意图例如以下:

3、Method Area 方法区

方法区是被全部线程共享。该区域保存全部字段和方法字节码,以及一些特殊方法如构造函数。接口代码也在

此定义。

4、PC Register 程序计数器

每一个线程都有一个程序计数器。就是一个指针,指向方法区中的方法字节码,由运行引擎读取下一条指令。

5、Native Method Stack 本地方法栈

时间: 2024-11-06 17:01:55

JVM组成部分以及内存模型的相关文章

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

jvm(12)-java内存模型与线程

[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计算机性能发展源动力的根本原因: 2)Amdahl 定律:该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力: 3)摩尔定律:该定律用于描述处理器晶体管数量与运行效率间的发展关系: Conclusion)这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展

JVM学习 - 体系结构 内存模型

一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小. 运行时常量池:是方法区的一部分,Class文件中除了有类的版本.字段.方法.接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加

JVM(二):内存模型

内存模型 Java堆(Heap) Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存. Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做"GC堆".如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代:新生代又可细分为 Eden空间.From Survivor空间

JVM原理与内存模型

编译型语言:一次性地编译成机器码,生成可执行文件.解释型语言:使用专门的解释器对源码逐行解释成特定平台的机器码并立即执行的语言. JVM原理:Java语言既是编译型语言,又是解释型语言:Java源码通过javac命令被编译成.class文件,这种字节码文件不面向任何平台,只面向JVM(Java Virtual Machine):JVM是Java跨平台的关键部分,其向上提供给Java字节码程序的接口完全相同,而向下适应不同平台的接口则互不相同,为特定平台提供特定机器码,使用java命令解释执行.

jvm 03-java堆内存模型

java中最大的特点在于其具备良好的垃圾收集特性 GC是整个java之中最重要的安全保证 整个JVM中的GC的处理机制:对不需要的对象进行标记,而后进行清除 JVM堆内存划分 在JDK1.8之后,将最初的永久带内存空间取消了,该图为JDK1.8之前的内存空间组成 取消永久代目的是为了将HotSpot于JRockit两个虚拟机标准联合为一个 在整个JVM堆内存之中实际上将内存分为了三部分: 新生带(年轻代):新对象和没达到一定年龄的对象都在年轻代 老年代:被长时间使用的对象,老年代的内存空间应该要

【转】深入理解JVM—JVM内存模型

http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变

深入理解JVM—JVM内存模型

原文地址:http://www.lofter.com/app/QRCodedownload?act=qbbkdlxz_20150313_13 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因

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

原文地址:http://www.cnblogs.com/dingyingsi/p/3760447.html 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下