关于JVM(基本常识)_jvm是什么意思-程序员宅基地

技术标签: java  javaSE基础入门  开发语言  

目录

一、JVM是什么

        1、概述

二、为什么要用JVM

        1、java程序的执行流程

        2、JVM的架构

一、JVM是什么

        1、概述

                 关于JVM,在百度上的解释为:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码,就可以在多种平台上不加修改地运行。

                简单地说,JVM是《JVM虚拟机规范》中提出来的规范,并不是具体实现,相当于“接口”,而真正实现他的是形如HotSport的“实现类”。

                从百度的定义来看,我们可以发现:JVM并不是只为Java语言服务,而是针对字节码文件,只要是字节码文件,JVM就支持。

 像java语言自不必说,还有大数据开发常用的Scala语言,Groovy语言,python等其他语言经过处理也可以转换成字节码文件,从而在JVM环境中运行。

二、为什么要用JVM

        1、java程序的执行流程

                程序执行的方式一般有三种,包括静态编译执行、动态编译执行、动态解释执行。编译指的是将程序编译成可让操作系统直接执行的机器码。在java语言中,程序的执行方式是以动态解释为主,动态编译为辅(静态编译执行类似C语言,编译成可执行文件(windows一般是exe,Linux一般为sh),里面存的都是机器码)。

                1.1字节码与机器码的区别:

                                机器码:是CPU直接读取的机器指令,运行速度非常快。

                                字节码:一种中间状态的二进制文件,需要直译器转译后才能变成机器码。   

                1.2执行流程图:

                                                     

                         如上图得出一个结论:java程序编译成的字节码文件可以做到一次编译到处使用,字节码不分操作系统,而不同的操作系统的JVM是不同的,所以只要是字节码,就能在不同的平台由不同的JVM解释成为机器码进行运行使用,所以为什么jdk的下载区分操作系统,这也体现了java语言的(.class字节码文件)强大的跨平台性和可移植性。

                1.3JDK、KRE、JVM之间的关系

                        JDK主要包括了编译器等开发工具和JRE两部分,JRE包含了JVM和运行类库。

                有关OpenJDK和OracleJDK的区别

                        在命令行中使用命令        java -version   通过查看结果进行区分

                                ①若为下图所示:

                                 则表示该JDK为OracleJDK,其中HotSpot为JVM的实现,HotSpot为JVM规范的商用产品,除此之外还有Oracle JRockitIBMJ9;Server为该JVM的运行模式,JVM有两种运行模式,分别为Client模式和Server模式;对于这两种模式,他们是互补的关系,区别在于Client模式启动速度较快,Server模式启动较慢; 但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。 因为Server模式启动的JVM采用的是重量级的虚拟机,对程序进行了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

                                ②若结果为

                                        openjdk version " 1.8.0_144 "
                                        OpenJDK Runtime Environment (build 1.8.0_144 - b01)
                                        OpenJDK 64 - Bit Server VM (build 25.144 - b01, mixed mode),则为OpenJDK,OpenJDK和OracleJKD的区别主要在于:OpenJDK最早为SUN公司进行开发维护,在SUN公司被Oracle公司收购之后,Oracle也就成了唯一的维护者,OracleJDK是在OpenJdk的基础上构建实现的,他们之间的技术差别其实并不大;OpenJDK可免费商用,而OracleJKD个人使用免费,商用需要付费。

        2、JVM的架构

               

                 2.1基于JVM架构的JVM程序执行流程:

                        首先,由java编译器(javac)将java源代码.java文件编译成为java字节码.class文件,该字节码文件可能存在于网络、内存、硬盘等地方,而JVM都有方式可以将其加载到类装载器中,进行字节码验证等操作,若为非法字节码文件,则会被丢弃,之后再通过对于热点代码的判断,在java解释器和即时编译器之间进行协调选择执行,然后转换成操作系统可识别的机器码运行程序。

                2.2java解释器和编译器(JIT)之间的协调配合流程:

                在一些商用JVM实现中(这里举例HotSpot) ,字节码转换为机器码的操作最初是由解释器interpretor执行的,但是当一个代码或者代码块执行的次数(如一个方法的频繁调用和循环体的多次执行)很多时,如果每次都进行解释,那么对于空间会造成浪费和拥挤,也会降低JVM的性能,导致程序的执行缓慢,而JIT(Just In Time Compiler)很好的解决了这个问题,在JIT中(参照上图的JVM架构图),探测器检测并判断哪些代码为热点代码,并标记,然后将他们编译成与本地平台相关的机器码,并进行代码的优化,提高了程序执行的效率;JIT是属于在运行时进行编译的动态编译,这种编译方市因为编译发生在方法执行过程之中,因此形象的称为栈上替换(On Stack ReplacementOSR),即方法栈帧还在栈上,方法就被替换 了

                2.3热点代码的探测有两种方式,分别是基于采样的热点探测基于计数器的热点探测

  • 基于采样的热点探测:虚拟机会周期性地检查各个线程的栈顶,如果发现某些方法经常出现在栈顶,那这个方法就是热点方法这种探测方法的好处是实现简单高效,还可以很容易地获取方法调用关系(将调用堆栈展开即可),缺点是难以精确地确认一个方法的热度,容易因为受到线程阻塞或别的 外界因素的影响而扰乱热点探测。
  • 基于计数器的热带探测:虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果执行次数超过一定的阀值(通常情况下为10000次,也可以自定义),就认为它是热点方法这种统计方法实现复杂一些,需要为每个方法建立并维护计数器,而且不能直接获取到方法的调用关系,但是它的统计结果相对更加精确严谨。

                

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

智能推荐

HTML5标准学习 - 编码-程序员宅基地

文章浏览阅读60次。HTML5标准学习 - 编码 from:http://www.cnblogs.com/GrayZhang/archive/2011/04/11/learning-html5-charset.html相信每一个前端工程师都或多或少遇上过“乱码”这位仁兄,无论你的基...

AB压测工具的介绍及安装-程序员宅基地

文章浏览阅读1.9k次。今天我要和大家聊聊AB压测工具,如果你对网站性能测试感兴趣或有需要,那么这篇文章一定会帮到你。我曾经也因为缺少良好的压力测试工具而苦恼,直到我发现了AB压测工具。它可以帮助我们测试网站在高并发情况下的性能表现,让我们更好地了解网站的性能瓶颈和优化方向。接下来,我将为大家介绍AB压测工具的安装和使用方法,希望能够帮助大家更好地进行网站性能测试,提升网站的质量和用户体验。_ab压测工具

使用URL启动android默认浏览器,启动指定浏览器_scheme打开系统自带浏览器-程序员宅基地

文章浏览阅读847次。打开URL启动android默认浏览器,启动指定浏览器 分类: android2015-05-07 09:2718人阅读评论(0)收藏举报浏览器uri原文出自:http://blog.csdn.net/u013812046/article/details/39226515一、启动android默认浏览器  Intent intent _scheme打开系统自带浏览器

计算机网络学习建议_计算机网络课程设计的建议-程序员宅基地

文章浏览阅读863次,点赞2次,收藏2次。计算机网络+计算机网络课程设计这门课挺有意思,是真的有意思,知道一个网络具体是怎么运作,然后还能自己动手配置一个网络,观察一个数据包的流转过程,不过学校的课程不是那么全面,讲得不是那么浅显易懂,学完只是懂了一些老古董。除此之外,课程安排确实让人吐槽,连上四节课,一般上到第三节课就已经熄火了,听不进去。关于课程设计安排更是有问题,思科学院的东西,如此现代,如此浅显易懂,居然让我们用课设时间去看,最关键的是,课设只有四天,你要看完一本书,这是不切实际的,完完全全地浪费了那么好的课程,所以不建议的那么安排。_计算机网络课程设计的建议

第三章--第二篇--开放式对话系统_开放式对话不支持多轮-程序员宅基地

文章浏览阅读545次。概念:开放式对话系统是指一种可以与用户进行自由对话的系统,用户可以提出任意话题的问题或发表意见,而系统能够理解用户的输入并做出相应的回应。与任务导向的对话系统不同,开放式对话系统更注重与用户的自由互动,旨在模拟人类的对话能力和语言交流。目标:开放式对话系统的目标是实现自然、流畅、有趣的对话体验,使用户感到与真实人类对话类似。自然性:系统能够理解用户的语言表达,包括词汇、语法、语义等,并以自然、流畅的方式进行回应,使用户感到在与真人交谈。_开放式对话不支持多轮

个人网站制作源代码_个人网站源码-程序员宅基地

文章浏览阅读9.2k次。/ 01 /前话《周末·听雨》包含动态雨滴效果,采用Dreamweaver软件制作,代码结构简单,DIV+CSS布局,目录结构为index.html页面、js、css和images文件夹。/ 02 /图摘/ 03 /_个人网站源码

随便推点

python提取数据指定列_Python:提取特定列数据并将其存储到变量中-程序员宅基地

文章浏览阅读5.4k次。我有一个csv文件,我想从中提取ratings和comments字段,并将其存储在两个变量中-rating和comment。这个过程完成后,我需要查看提取的数据。CSV文件中存储的数据如下:在我的dataclean python文件中,目前编写的代码是:class Extractdata:def __init__(self, rating, comment):self.rating = ratin..._python提取特定列数据

<jsp:include page="" /> org.apache.jasper.JasperException: Unable to compile c-程序员宅基地

文章浏览阅读404次。[b]引入一个页面,出现如下异常:[/b] [code="java"] 2010-10-6 11:44:08 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() for servlet jsp threw exceptionorg.apache.jasper.JasperExcept..._exception: unable to compile expression "$.data": syntax error token recogni

Android5.0 WebView中Http和Https混合问题-程序员宅基地

文章浏览阅读981次。http://blog.csdn.net/luofen521/article/details/51783914http://blog.csdn.net/luofen521/article/details/51783914http://blog.csdn.net/luofen521/article/details/51783914场景复现:

Laravel微信静默登录教程_laravel 微信登录-程序员宅基地

文章浏览阅读252次。注:用户表字段必须有oppid & session_key。_laravel 微信登录

Resources (library) in JSF 2.0_outputscript-程序员宅基地

文章浏览阅读339次。In JSF 2.0, all your web resources files like css, images or JavaScript, should put in “resources” folder, under the root of your web application (same folder level with “WEB-INF“).The sub-folder under_outputscript

文本处理命令(增删改查文本)_grep 找到重复的字符,删除-程序员宅基地

文章浏览阅读402次。一、显示文本(一)more命令1.语法格式格式:more [选项] filename功能:读取filename中的内容,逐屏往下翻页显示,按h显示帮助,按q退出。2.选项-d, --silent display help instead of ringing bell-f, --logical count logical rather than screen lines-l, --no-pause suppress pause after form feed-c, --print-over do_grep 找到重复的字符,删除