Jvm系列-Jvm概述(一)_理科男同学-程序员宅基地_jvm

技术标签: JVM  Java  jvm概述  

目录

1,什么是JVM?

2,JVM跨平台及原理

3,JVM的分类

4,JVM的位置

5,JVM的体系结构

6,Java代码的执行流程

7,JVM的架构模型

8,JVM的生命周期

9,三大商业虚拟机


1,什么是JVM?

  • JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机。
  • jvm是运行在操作系统之上的,与硬件没有任何关系。

2,JVM跨平台及原理

  • 跨平台:由Java编写的程序可以在不同的操作系统上运行:一次编写,多处运行。
  • 原理:编译之后的字节码文件和平台无关,需要在不同的操作系统上安装一个对应版本的虚拟机(JVM) 

3,JVM的分类

  • 类加载子系统。
  • 运行时数据区 [ 我们核心关注这里 的栈、堆、方法区 ]。

  • 执行引擎(一般都是JIT编译器和解释器共存)

    • JIT编译器(主要影响性能):编译执行; 一般热点数据会进行二次编译,将字节码指令变成机器指令。将机器指令放在方法区缓存。

    • 解释器(负责响应时间,他的响应时间很快):逐行解释字节码。

4,JVM的位置

JVM位于操作系统上层,但是位于应用程序下层。

5,JVM的体系结构

  • 入口是编译好的字节码文件(编译器前端)-->经过类加载子系统(将我们的字节码加载到内存当中,生成一个class对象,中间经过三步:加载--->链接--->初始化)

  • 在内存中,多个对象共享内存的是方法区和堆区(多个线程共享区)。

  • Java虚拟机栈,本地方法栈,程序计数器每一个线程独有一份。

  • 执行引擎:解释器(解释运行),jit及时编译器(编译器后端),垃圾回收器三部分。

6,Java代码的执行流程

  •  高级语言翻译为机器指令,主要是由执行引擎完成的。
    • 解释器(解释运行,把字节码翻译为机器指令,主要负责翻编译器性能)。
    • jit及时编译器(编译器后端,主要是把热点代码缓存起来,主要负责编译器性能)组成执行引擎。

7,JVM的架构模型

Java编译器输入的指令流基本上是基于栈的指令集架构,另一种指令集架构是基于寄存器的指令集架构,两种架构之间的区别如下:

基于栈实现的指令集特点如下:

  • 设计和实现更加简单,适用于资源受限的系统。

  • 避开了寄存器额分配难题,使用零地址指令分配方式。

  • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器更加容易实现。

  • 不需要硬件支持,可移植性好,更好实现跨平台。

  • 基于栈的指令集:跨平台性,指令集小,指令多执行性能比寄存器差。

基于寄存器指令集的特点:

  • 典型的应用是x86二进制指令集,比如传统的pc以及android的davlik虚拟机。

  • 指令集架构完全依赖于硬件,可移植性差。

  • 性能优秀和执行更加高效。

  • 花费更少的指令去完成一项任务。

  • 在大部分情况下,基于寄存器的指令集往往都以一地址指令,二地址指令,三地址指令为主,而基于栈结构的指令集则以零地址为主。

小结:

由于扩平台式的设计,Java的指令集都是根据栈来设计的,不同的平台cpu架构不同,所以不能设计为基于寄存器的,优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

8,JVM的生命周期

  • 虚拟机的启动

    • Java虚拟机的启动是通过引导类加载器bootstrap class loader创建一个初始类initail calss来完成的,这个类是由虚拟机的具体实现指定的。

  • 虚拟机的执行:

    • 一个运行着的java虚拟机有着清晰的任务,执行java程序。

    • 程序开始执行虚拟机就运行,程序结束虚拟机就结束运行。

    • 执行一个java程序的时候,真真正正的在执行的是一个java虚拟机进程。

  • 虚拟机的停止:以下几种情况会退出虚拟机:

    • 程序正常执行结束。

    • 程序在运行过程中遇到错误或者异常而终止执行。

    • 由于操作系统发故障而导致虚拟机进程终止运行。

    • 某一个线程调用了Runtime类或者system类的exit方法,或者调用runtime类的halt方法,并且java安全管理器允许执行安全退出的方法。

9,三大商业虚拟机

  • Sun HotSpot

    • 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

    • 在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码, 并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。

    • 在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。 Oracle公司宣布在不久的将来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工作,使之优势互补。 整合的方式大致上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务, 使用HotSpot的JIT编译器与混合的运行时系统。

    • 从服务器,桌面,到移动端,嵌入式都有应用。

  • BEA JRocket

    • 专注于服务端应用(JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行)。

    • Jrockit JVM 是世界上最快的jvm3. 2008年被oracle收购。

    • 专注于服务器端的应用。

    • 它不太关注程序的启动速度,因此JRockit内部不包含解析器的实现,全部代码都靠及时编译器编译之后执行。

  • iBM J9

    • 市场定位与hotspot接近,服务器端,桌面应用,嵌入式等。

    • 目前,是影响力最大的三大商业虚拟机之一。

    • 应用于IBM的各种Java产品。


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38163244/article/details/109551205

智能推荐

MongoDB(一)_lovewangyihui的博客-程序员宅基地

MongoDB数据库一、NoSQL 简介NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。通过应用实践证明,关系模型是非常适合于客户服务器编程,

操作系统(三)_Lailikes的博客-程序员宅基地

● 请你来说一说协程参考回答:1、概念:协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。例如:def A() :print '1'print '2'print '3'def B() :print 'x'print 'y'print 'z'由协程运行...

java 线程 更新控件_MFC子线程中更新控件内容的两种办法_伍治坚的博客-程序员宅基地

一、概述每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率。针对界面来说,还能提高界面的响应能力。一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线程中运行,而所有与主UI线程有关的控件数据刷新应该到主UI线程中处理。也就是数据处理线程发消息,让界面UI去更新控件。在MFC中线程分为界面线程和工作者线程,界面实际就是一个线程画出来的东西,这个线程维...

js获取屏幕、浏览器、页面的高度宽度_星繁~的博客-程序员宅基地_js获取浏览器的宽度和高度

本篇主要介绍Web环境中屏幕、浏览器及页面的高度、宽度信息。一、介绍1. 容器一个页面的展示,从外到内的容器为:屏幕、浏览器以及页面本身。HTML元素展现在页面内,页面展现在浏览器内,而浏览器展现在屏幕内。通过Js的一些对象可以获取这些容器的高度、宽度。2. 物理尺寸和分辨率容器的尺寸是指当前分辨率下的高度、宽度,而不是物理高度、宽度。如:一个22寸的显示器,屏幕分辨率为1366 * 768,那么获取到的屏幕高度为1366px,宽度为768px。3. 展示图注意:图中的body根

python中哪些是无序_Python中的无序位_英伦百宝箱的博客-程序员宅基地

作为Python的初学者,我认为创建一个超出我技能范围的项目来了解这种语言是很好的。不幸的是,这个项目中最困难的部分涉及到移动位,这是另一个挑战,因为我发现很难把我的头围绕在比特上。我知道每个接线员都在做什么,我只是觉得很难让它做我想做的事。在很明显我失败了,所以这个问题。在我试图通过使用预定义的索引列表更改位顺序来加密字符串。我以为我做得很好,但它不起作用,我不知道为什么。在即使我的代码可以完成...

第一阶段项目感受——漫漫代码路,与君共勉_u011886490的博客-程序员宅基地

真是土掉渣的文章标题,不过想了半天,也只剩下这个标题了…… 谈到第一个项目,不自觉的就想到自己来兄弟连的初衷,本人是广告学专业出身,于是毕业后就顺理成章的从事媒体代理这类的工作,因为工作的第一家公司是一个外企,而且规模也不小,在行业内也算有点名气,当时也很有雄心壮志的要把这份工作做好,抱着这个想法坚持了一年半,不过事与愿违,渐渐发现自己的兴趣竟然不在广告这一块,反而对计算机啊、编程啊、帮

随便推点

微信授权登陆回调传多个参数_小小舍的博客-程序员宅基地

单参数一般直接用state即可,但多参数还是拼接在redirect_uri后面比较好我的用法如下:主要代码:其实就是先拼接好回调请求url域名/api/wxAuth/callBack?recommendId=1234&channelSource=sew然后:String redirect_uri = URLEncoder.encode(backUrl+param,"UTF-8");拿到redirect_uri拼接进重定向url即可。重定向时的url..

DBA查询命令积累——不断更新_weixin_34192993的博客-程序员宅基地

原文: DBA查询命令积累——不断更新 一、服务器配置:1、兼容级别:兼容级别只影响指定数据库中的行为,而不会影响整个服务器上的行为。1.1、查看数据库兼容级别及更改兼容级别:SELECT compatibility_level FROM sys.databases WHERE name=DB_NAME()1...

Tinker基本使用_weixin_34189116的博客-程序员宅基地

###Tinker简介与核心原理之前的文章中,我们学会了使用AndFix进行线上BUG的热修复。但是有一些BUG可能是因为资源文件、配置文件等非方法引起的BUG的时候,AndFix就无能为力了。因此这里有必要介绍Tinker。关于什么是TInker,Tinker的官方文档里面有一句话:Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重...

EosStore发起人陆海峰:为什么不要接受“贿选”?_陀螺财经的博客-程序员宅基地

2018年5月04日,应陀螺财经之邀,EosStore发起人陆海峰亲临陀螺财经微信社群演讲直播。本次直播为陀螺财经Value100之EOS超级节点竞选公开演讲的第四场,直播活动共吸引了8000多人共同在线收听。演讲同步转播至陀螺财经40多个粉丝社群,同时还有40多家媒体进行了同步报道。以下为,陆海峰群分享的部分内容,经陀螺财经整理发布:▍为什么不要贿选?虽然官方有禁止,但是在国内依然有很多节...

Django后端笔记(五)静态文件、中间件、后台管理_M行者X的博客-程序员宅基地

Django后端笔记其他技术静态文件使用加载目录中间件获取浏览器端的ip地址使用中间件Admin后台管理 (了解)使用上传图片创建包含图片的模型类在管理页面admin中上传图片用户自定义页面上传图片分页省市县选择案例其他技术静态文件使用在 网页使用的css文件,js文件和图片叫做静态文件。新建静态文件夹 static。配置静态文件所在的物理目录。Settings.pySTATIC_URL设置访问静态文件对应的url。STATICFILES_DIRS设置静态文件所在的物理目录。动态

MyEclipse无法连接JVM_goInfall的博客-程序员宅基地

启动360杀毒和安全卫士,导致运行java Application没有结果,debug Application出现Cannot to connect to VM,socket closed累世错误的解决方法

推荐文章

热门文章

相关标签