jvm、jre、jdk
JVM和JRE浅谈
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方法的状态;本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现(如果不懂得话,参见本文后面提供的参考文档连接)。
jvm、jre、jdk的更多相关文章
- POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别
POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等 ...
- jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...
- JDK、JRE、JVM详解
JDK.JRE.JVM JDK包含JRE,而JRE包含JVM JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java ...
- JDK、JRE、JVM之间的关系
JDK.JRE.JVM之间的关系 1.JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...
- JDK、JRE、JVM三者关系
一.JDK.JRE.JVM三者的关系 JDK包含了JRE和JVM,JRE包含了JVM,其中JRE中没有javac 附一张官网的详细图: 二.RIA RIA(富客户端):能完成浏览器无法完成的功能,它是 ...
- IT兄弟连 Java语法教程 Java开发环境 JVM、JRE、JDK
要想开发Java程序,就需要知道什么是JVM.JRE以及JDK.JVM是运行Java程序的核心,JRE是支持Java程序运行的环境,而JDK是Java开发的核心,下面我们分别具体介绍它们以及它们之间的 ...
- 认识JDK、JRE、JVM
JDK.JRE.JVM之间的关系: 首先看看JDK与JRE的区别与联系,如下图所示: 由图可知: JDK = JRE + Tools&Tool APIs JDK的核心是Java SE API. ...
- 关于JVM、JRE、Jdk三者的定义与联系
许多初学者对于java中的JVM.JRE.JDK三者的定义与联系有些模糊,接下来我就根据我的理解来为各位解答一下,希望能帮到正在努力的你们. JVM JVM是Java Virtual Machin ...
- jvm内存模型-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东)
参考:JVM的垃圾回收机制 总结(垃圾收集.回收算法.垃圾回收器) 1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2) ...
- JVM、JRE和JDK三者间的区别和联系
简介:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JV ...
随机推荐
- 有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
[提交][状态][讨论版] 题目描述 有一字符串,包含n个字符.写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串. 输入 数字n 一行字符串 数字m 输出 从m开始的子串 样例输入 ...
- shell中的语法(1)
反引号 命令替换.将命令的输出放在命令行的任意位置. eg. [root@gam ~]# echo The Data is `date` The Data is Fri Nov 18 10:13:56 ...
- R语言获取国内的股票数据
quantmod 包默认是访问 yahoo finance 的数据,其中包括上证和深证的股票数据,还有港股数据. 上证代码是 ss,深证代码是 sz,港股代码是 hk 例如苏宁云商 setSymbol ...
- win10 剪贴板 拒绝访问
win10 Cannot open clipboard:拒绝访问.
- Find the largest K numbers from array (找出数组中最大的K个值)
Recently i was doing some study on algorithms. A classic problem is to find the K largest(smallest) ...
- BAT 快速删除CVS文件和拷贝最近修改文件的目录结构
相信大家在操作大量文件的的时候,经常会遇到一些手动很难操作的情况 比如有CVS版本控制下每个文件夹下都有一个CVS文件夹,一个个手工删除肯定很费劲,我们都是懒人,还是用工具解决吧.不用重新写程序,直接 ...
- MFC 给对话框注册热键
在头文件中添加: //}}AFX_MSGafx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//(此行为加入的)BEGIN_MESSAGE_MA ...
- c++ 成员函数
#include <iostream> #include "Sales_item.h" int main() { Sales_item item1, item2; st ...
- eclipse查看class文件的源码
eclipse查看class文件的源码: 1.网上下载jadClipse的jar包和执行文件jad.exe和 net.sf.jadclipse_3.3.0.jar. 2.把上面下载的jar包放在ecp ...
- 设置centos7默认运行级别
1.查看当前运行级别 systemctl get-default 2.设置命令行运行级别 systemctl set-default multi-user.target 3.设置图形化运行级别 sys ...