一、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 本地方法栈

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

  1. [转帖]JVM—深入理解内存模型与垃圾收集机制

    JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...

  2. (转载)JVM中的内存模型与垃圾回收

    转载自微信公众号:Java高级架构(Java-jiagou)-----看完这篇文章,我奶奶都知道JVM中的内存模型与垃圾回收了! 六.内存模型 6.1  内存模型与运行时数据区 Java虚拟机在执行J ...

  3. JVM学习笔记——内存模型篇

    JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...

  4. 【JVM】Java内存模型

    原文:多线程之Java内存模型(JMM)(一) 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per S ...

  5. 【JVM】JVM系列之内存模型(六)

    一.前言 经过前面的学习,我们终于进入了虚拟机最后一部分的学习,内存模型.理解内存模型对我们理解虚拟机.正确使用多线程编程提供很大帮助.下面开始正式学习. 二.Java并发基础 在并发编程中存在两个关 ...

  6. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  7. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

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

    [0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识:   [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...

  9. 看完这篇文章,我奶奶都知道什么是JVM中的内存模型与垃圾回收!

    扩展阅读:JVM从入门开始深入每一个底层细节 六.内存模型 6.1.内存模型与运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同数据区域. Java内存模型的主要目 ...

随机推荐

  1. 五十六 SMTP发送邮件

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...

  2. 使用jsonp形式跨域访问实现电商平台的左侧导航栏

    电商平台有个具备的左侧商品类目的导航栏的结构. 通过jsonp跨域访问电商平台的后台管理系统商品分类.(主要实现后台Java代码) 实现基本步骤: 1.在后台管理系统中准备相应的json数据. poj ...

  3. SpringBoot整合Quartz作为调度中心完整实用例子

    因为想要做一个类似于调度中心的东西,定时执行一些Job(通常是一些自定义程序或者可执行的jar包),搭了一个例子,总结了前辈们的相关经验和自己的一些理解,如有雷同或不当之处,望各位大佬见谅和帮忙指正. ...

  4. 洛谷——P2952 [USACO09OPEN]牛线Cow Line

    P2952 [USACO09OPEN]牛线Cow Line 题目描述 Farmer John's N cows (conveniently numbered 1..N) are forming a l ...

  5. 【二分答案】【最大流】[HNOI2007]紧急疏散EVACUATE

    [HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...

  6. 【SAM】BZOJ2882-工艺

    [题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法的正解:★ SAM乱搞,和前面的POJ那道一样.然而MLE了,当作学习一下map的用法^ ^ map的使用方法(来源:☆) 一.map的 ...

  7. 【莫比乌斯反演+容斥】BZOJ2301-[HAOI2011]Problem b(成为权限狗的第一题纪念!)

    [题目大意] 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. [思路] “怎么又是你系列……”思路 ...

  8. 【动态规划去除冗余】NOIP2010-乌龟棋

    [题目大意] [思路] 最简单的思路是五维数组,但是当前走到的步数由已经取到的卡片决定,所以只需要四维.本来想要改一个滚动数组的,但是好像没有滚起来,算了(ノ`Д)ノ. 在学校要晚自习到21:15,回 ...

  9. 中间件和auth模块

    中间件 1.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用 ...

  10. python安装BeautifulSoup

    1.先下载pip https://pypi.python.org/pypi/pip 安装pip cd到路径 python setuo.py install 2.添加目录到环境变量中 xxx\Pytho ...