jvm(Java virtual machine) JVM架构解释

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

JVM 架构解释

每个Java开发者都知道通过JRE【Java运行环境】执行字节码。

但是很多人都不知道JRE是JVM实现的事实。JVM负责执行字节码的分析

代码的解释和运行。

我们应该了解JVM的架构,这对开发者来说是很重要的,这促进我们更有效的

编写代码。在本文中,我们将深入学习有关JVM的架构和JVM组件的区别。

什么是JVM?

虚拟机是物理机的一个软件实现。

JAVA是基于WORA(一次编写,到处运行)的概念开发的,它运行在虚拟机上。

编译器将Java文件编译成class文件,然后将class文件输入到JVM,JVM加载并运行class文件。

下面是JVM架构

1e908c486e02789f0793e9d524b8b462ad5.jpg

JVM是如何工作的?

像上面图表显示那样,JVM分成3个主要的子系统:

  1. 类加载器子系统
  2. 运行时数据区
  3. 执行引擎

 

1、类加载器子系统

Java的动态类加载功能是通过类加载子系统去处理的。

它并不是在编译时候,而是在首次运行时加载引用类时、连接并初始化类文件。

 

1.1 加载

类通过该组件加载。通过引导类加载器,扩展类加载器,应用类加载器这三个类加载器帮助完成加载。

  1. 引导类加载器

负责从引导类路径去加载类,除了rt.jar之外,没其他别的jar。给予该加载器最高的优先级。

  1. 扩展类加载器

负责加载ext目录(jre\lib)的类

  1. 应用加载器

负责加载类路径中应用级别的类,path提到的环境变量,等等。

以上的类加载器在加载类文件的时候遵循委托层次算法。

1.2连接

  1. 验证-字节码验证器验证生成的字节码是否正确,如果验证失败,我们将收到验证的错误信息。
  2. 准备-为所有的静态变量分配内存和默认值
  3. 解析-用方法区的原始引用代替所有符号内存引用。

 

1.3 初始化

这是类加载的最后一个阶段,此时所有的静态变量都用原始值去赋值,并且将运行静态代码块。

2、运行时数据区

运行时数据区域分成5个主要的组件:

  1. 方法区-所有类级的数据都存储在这里,包括静态变量。

每个JVM只有一个方法区,它是一个共享资源。

  1. 堆区-所有的对象和对应的实例变量以及数组都存储在这里。

每个JVM只有一个堆区,由于方法区和堆区为多个线程共享内存,所以

存储的数据不是线程安全的。

  1. 栈区-为每个线程,创建一个单独的运行时栈。为每个方法调用,在栈内存创建一个条目,称之为栈帧。所有本地变量都会在栈内存中创建。由于它不是共享的资源,所有是线程安全的。

栈帧被分成3子实体

  1. 本地变量数组-涉及跟方法有关的本地变量和对应的值都存储在这里。
  2. 操作数栈-如果需要执行中间操作,操作数堆栈作为运行时工作区来执行操作。
  3. 帧数据-所有和对应方法的标记都存储在里面。在发生异常的情况下,捕捉块信息在这里维护。
  1. 程序计数器寄存器--每个线程都有自己的程序计数器寄存器,持有当前执行指令的地址,一旦当前指令执行被运行,下一个指令将会更新到程序计数器寄存器。

3、执行引擎

字节码被分配到执行引擎执行的运行时数据区。执行引擎一块一块的读取字节码并执行。

  1. 解释器-解释器解释字节码很快,但是执行的很慢。解释器的缺点是当一个方法被调用多次,每次都需要一个新的解释。
  2. JIT编译器-JIT弥补了解释器的缺点。执行引擎将利用解释器转换字节码,但是当他找到重复的编码,它就使用编译器。编译器编译全部的字节码并变成本地代码

这些本地码将直接被方法调用重复地使用,这就改善了系统的性能。

  1. 中间代码生成器-生成中间代码。
  2. 代码优化器-负责优化上面生成的代码
  3. 目标代码生成器-负责生成机器码或者本地代码
  4. 分析器-一个特殊的组件,负责寻找hotspots,即是否方法被调用多次。

 

  1. 垃圾收集器:收集和清除未被引用的对象,可以通过System.gc()触发垃圾回收,但是不保证一定执行。创建收集对象的JVM垃圾收集。

 

Java Native Interface (JNI):JNI和本地方法库互动,特供本地库所需的执行引擎。

Native Method Libraries: 这是执行引擎所需的本地方法的一个集合

 

本文为在下翻译外文的处女作,水平有限,翻译不恰当之处,烦请读者指正!

原文地址:https://dzone.com/articles/jvm-architecture-explained

 

转载于:https://my.oschina.net/benz001/blog/2990014

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hyper-V 嵌套虚拟化

先决条件运行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V 主机。运行 Windows Server 2016 或Windows 10 周年更新的 Hyper-V VM。配置版本为 8.0 或更高的 Hyper-V VM。采用 VT-x 和 EPT 技术的 Intel 处理器(AMD-V技术的暂时不支持)>Set…

简单的面试题简解思路(搜集)

1. 统计字符串中单词出现次数 "hi how are you i am fine thank you youtube am am ",统计"you"出现的次数。 方法一 : split() function wordCount(str,word){var str str || "";var word word || "";var strArr s…

WinForm(十五)窗体间通信

在很多WinForm的程序中,会有客户端之间相互通信的需求,或服务端与客户端通信的需求,这时就要用到TCP/IP的功能。在.NET中,主要是通过Socket来完成的,下面的例子是通过一个TcpListerner作为监听,等待TcpClie…

905. 按奇偶排序数组

1// 905. 按奇偶排序数组 2/** 3 * param {number[]} A 4 * return {number[]} 5 */ 6var sortArrayByParity function(A) { 7 return A.filter(value > value % 2 0).concat( 8 A.filter(value > value % 2 1) 9 )10}; 转载于:https://www.cnblogs.com/…

关于Java开发需要注意的十二点流程

1.将一些需要变动的配置写在属性文件中 比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中,还是TEST环境中,都可以顺畅无阻地运行,但是一旦部署在PROD上,把它作为多线…

Unity经典游戏教程之:雪人兄弟

版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客"(微信号:unitymaker)您可以自由转载&#x…

使用webpack搭建个性化项目

安装主包 yarn add webpack webpack-cli webpack-dev-server -D根据项目实际需求安装loaders,webpack-loaders列表 根据项目实际需求安装插件, webpack-plugins列表 常用包列表 包名说明webpackwebpack主程序,配置列表webpack-cliwebpack…

.NET周报【11月第1期 2022-11-07】

国内文章开源安全赋能 - .NET Conf China 2022https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg.NET Conf China 2022 是面向开发人员的社区峰会,延续 .NET Conf 2022 的活动,庆祝 .NET 7 的发布和回顾过去一年来 .NET 在中国的发展成果,它…

React - 状态提升

从入门的角度来聊一下React 的状态提升。我们先来看一下React官网是怎么介绍这一概念的:使用 react 经常会遇到几个组件需要共用状态数据的情况。这种情况下,我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理。很简单的一句介绍&#xff0…

saltstack(三) --- salt-httpapi

以下操作均在master上操作 1. 安装api netapi modules(httpapi)有三种,分别是rest_cherrypy、rest_tornado、rest_wsig,接下来要讲的是rest_cherrypydoc:https://docs.saltstack.com/en/latest/ref/netapi/all/salt.ne…

c++实现二叉搜索树

自己实现了一下二叉搜索树的数据结构。记录一下&#xff1a; #include <iostream>using namespace std;struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int value) { valvalue; leftNULL; rightNULL; } };class SearchTree{public:SearchTree();~Sear…

一款自用的翻译小工具,开源了

一款自用的翻译小工具&#xff0c;开源了TranslationTool作者&#xff1a;WPFDevelopersOrg - 唐宋元明清|驚鏵原文链接&#xff1a;https://github.com/Kybs0/TranslationTool此项目使用WPF MVVM开发。框架使用大于等于.NET461。Visual Studio 2019。最初是支持以下&#xff1…

JS使用按位异或方式加密字符串

按位异或加密字符串&#xff0c;字符串加解密都是该函数 缺陷是加密密钥使用的字符最好不要出现需要加密的字符串中的字符&#xff0c;一旦出现原字符与加密字符一样额情况&#xff0c;异或结果为0&#xff0c;导致不能还原字符串&#xff0c;可以考虑更改算法避免这种情况 im…

SCSS 实用知识汇总

1、变量声明 $nav-color: #F90; nav {//$width 变量的作用域仅限于{}内$width: 100px;width: $width;color: $nav-color; }.a {//报错&#xff0c;$width未定义width: $width; } 2、父选择器& scss代码&#xff1a; article a {color: blue;&:hover { color: red } } 编…

【ELK集群+MQ】通用部署方案以及快速实现MQ发布订阅服务功能

前言&#xff1a;大概一年多前写过一个部署ELK系列的博客文章&#xff0c;前不久刚好在部署一个ELK的解决方案&#xff0c;我顺便就把一些基础的部分拎出来&#xff0c;再整合成一期文章。大概内容包括&#xff1a;搭建ELK集群&#xff0c;以及写一个简单的MQ服务。如果需要看一…

python容错

#try: except: else: #为什么叫容错呢&#xff0c;先说说错误&#xff0c;这里说的错误并不是因为马虎或者什么原因在脚本中留下的bug&#xff0c;这个不能容掉&#xff0c;所谓容掉就是略过这个错误&#xff0c;要在测试时候发现并修正&#xff0c;需要容错的错误是在脚本执行…

git stash参数介绍

git stash 用于暂存工作区未提交的内容&#xff0c;便于在同时开发多个分支需要切换时保存当前分支进度。 list 语法 git stash list [<options>] &#xff0c;与git log功能类似&#xff0c;列出储藏列表&#xff0c;options 参数可以参考git log的参数 show 语法 git …

多语言报表的改动方法

在定义上传RTF模板的时候&#xff0c;会有一个是否可翻译的选项&#xff0c;选择之后。就能够上传xlf文件作为翻译内容。 对于已经存在的多语言类型报表&#xff0c;稍作改动之后再上传&#xff0c;可能会出现下面现象&#xff1a; 进程出现了“未完毕”的提示 想要改动非常eas…

自定义Cell的流程

1、.h文件 // // 文 件 名:CHBackupGateWayCell.h // // 版权所有:Copyright © 2018 lelight. All rights reserved. // 创 建 者:lelight // 创建日期:2018/12/19. // 文档说明: // 修 改 人: // 修改日期: //#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGINclass…

JS实时监听DOM元素变化 - MutationObserver

使用 MutationObserver API实时监听DOM元素变化 创建 MutationObserver 实列&#xff0c;接受一个用于监听到DOM元素变化的回调函数 const handleListenChange (mutationsList, observer) > {console.log(mutationsList, observer) } const mutationObserver new Mutati…