当前位置: 首页 > news >正文

jvm、jre、jdk

JVMJRE浅谈

       Java运行时环境JRE包含:Java虚拟机、库函数、运行Java应用程序和Applet所必须的文件,JDK(又称SDK)包含:JRE的超集、编译器、调试器等开发工具。

       java平台的核心是什么?JVM。大多数编程语言(其实应该是少数才对)直接把源代码编译成特定处理器体系结构的机器码,典型的是c,所以我们每个平台都有其对应的gcc版本。java与此不同,它把java源代码编译成一种特殊的机器码:字节码(byte code)——字节码不是java特有的东西,所有解释型的语言基本都有此概念,比如javascript。字节码可以运行在一种特殊的处理器上,实际上,这种处理器不对应任何硬件,它完全由软件来实现,这种处理器就是我们所称的java虚拟机。当初,当java语言发明的时候,JVM却没有同步跟着问世。JVM定义了一整套规范(就像ARM一样),任何组织或个人可以根据规范写出自己的虚拟机(要交不交钱我没去调查过)。总之,这样一个由软件构成的机器是一个“机器中的机器”(machine within a machine)。而且虚拟机并不是直接跑在宿主的cpu上,中间还隔着宿主的操作系统。那么虚拟机到底干了嘛?

       虚拟机的职责是:翻译字节码,把它翻译成一系列的动作(内存操作)和系统调用(比如输入输出)。举个例子:当在java里请求与某台远程机器建立socket连接时,java虚拟机本身是不能完成这一工作的(协议栈是在操作系统内实现的),所以它需要系统调用。不同的操作系统实现socket的方式不一样,但是java程序员却不需要关心它们的差别——这就是虚拟机的优势,write once,run everywhere(当然、实际上可能并没有广告里的好听,因为目标平台没有JRE时,看你怎么办,自己写一个不成?)。

       JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。

       JVM是只是一个更大系统JRE中的一部分。不同的操作系统和cpu架构需要不同的JRE。JRE包含一些基本类库,这些基本类库提供了java编程最基本的API。可以参见下图:

       

       JVMs之间的差异:

       尽管JVM的设计有共同的规范,但不同厂家具体实现时,都会加入自己的元素,比如:垃圾回收机制可能就极不相同,线程调度也是如此(这个是与操作系统密切相关的,JVM的线程机制依然构建在对操作系统的系统调用上)。不过这些不是什么问题,像垃圾回收、线程调度这种东西无论如何都会平台相关的,而程序员多半无需关心它们的异同。

       Java虚拟机的体系结构

       先google一把,得到以下二图(反映相同的东西):

    

       

刚才已经提到,JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同,然而JVM还是可以实现跨平台的特性,这就要归功于设计JVM时的体系结构了。

我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现JVM时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现时的外部行为。每个 JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做执行引擎。每个JVM又包括方法区Java程序计数器本地方法栈这五个运行期数据区(一组变量和几块内存区而已)。

JVM的每个实例都有一个它自己的方法域和一个堆,运行于JVM内的所有的线程都共享这些区域;当虚拟机装载类文件的时候,它解析其中的二进制数据所包含的类信息,并把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序计数器和Java,其中程序计数器中的值指向下一条即将被执行的指令(字节码形式的指令),线程的Java栈则存储为该线程调用Java方法的状态;本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现(如果不懂得话,参见本文后面提供的参考文档连接)。

转载于:https://www.cnblogs.com/boucher/p/5908655.html

相关文章:

  • Atitit 游戏的原理与概论attilax总结
  • CentOS6.5 修改系统时间
  • 微信小程序开发(一)之Hello World!
  • 苹果推送(APNs)ios push小结
  • co.js - 让异步代码同步化
  • Xcode 7中http通信出现如下错误
  • nginx(1)
  • jquery的回调对象Callbacks详解
  • 【转】基于jquery,bootstrap数据验证插件bootstrapValidator 教程
  • Tomcat调优测试
  • Android学习笔记——ListView升级版--RecyclerView控件
  • ArcGIS中的WKID
  • 开始ruby
  • git 命令
  • 2014.8.27 CAD数据结构
  • 网络传输文件的问题
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Docker 笔记(2):Dockerfile
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java|序列化异常StreamCorruptedException的解决方法
  • JS变量作用域
  • Linux链接文件
  • PermissionScope Swift4 兼容问题
  • PV统计优化设计
  • React Transition Group -- Transition 组件
  • supervisor 永不挂掉的进程 安装以及使用
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Webpack 4x 之路 ( 四 )
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端工程化(Gulp、Webpack)-webpack
  • 数据仓库的几种建模方法
  • 数组的操作
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一起参Ember.js讨论、问答社区。
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • (pojstep1.3.1)1017(构造法模拟)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (三分钟)速览传统边缘检测算子
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)ABI是什么
  • (转)setTimeout 和 setInterval 的区别
  • (转)大道至简,职场上做人做事做管理
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)一些感悟
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • . Flume面试题