对JDK,JRE,JVM的理解
JAVA用到现在还是分不太清楚JDK,JRE,JVM这三者的区别与联系,一直都是模模糊糊的。所以今天整理下此中的关系。 简单说明:我们编写的.java文件经过JDK(JDK的bin目录下javac.exe程序)编译成.class文件。之后.class文件会运行在JRE环境下并被JVM解释后交给操作系统。下面先上个大家非常熟悉的图:

1.JDK:编译环境(编译类库 + 编译程序) + JRE 。 简单的说就是提供了Java的开发环境和编译环境一般包含JRE,主要用于开发JAVA程序,面向Java程序的开发者。就是个对.java文件的编译器,像eclipse、idea等其他IDEd都有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径就ok了。 目录结构:
bin:最主要的是包含编译器,javac.exe与java.exe(这里JRE也有相同的java.exe下面再讲)。 db:纯Java开发的数据库Derby,是一个开源的100%Java开发的关系数据库。 include:C语言头文件,支持用Java本地接口和JVM接口来本机代码编程。就是存放着java和JVM交互用的头文件。 jre:存放着一个完整的JRE(如果安装一个外部的JRE话会存在两个JRE分别是这里和C:\Program Files\Java目录下),执行bin目录下的工具。 lib:存放着用来支持jdk\bin下面的开发工具(编译器所需的)的非核心类库(tool.jar,还有dt.jar包含了BianInfo文件用来与IDE交互,显示定制javabean组件外观的)。 2.JRE:解释环境(解释类库 + 运行工具) + JVM。 对编译好的java程序提供了解释环境且包含了JVM,面向java程序的使用者。就是运行.class文件之后交给JVM。 目录结构:
bin:包含运行工具,java.exe、javaw.exe、java-rmi.exe等等。 lib:包括java核心类,swing,rmi。java的API文档是对jre\lib\rt.jar的说明 3.JVM:java虚拟机,JRE的一部分。 1)我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分。所有的java程序会首先被编译为.class的类文件,这种类文件在JVM上执行解释,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释后交给本地系统执行。2)它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件(class file)。类文件的组成包括 JVM 指令集,符号表以及一些补助信息。 JRE目录下的Bin目录有两个目录:server与client。这就是真正的jvm.dll所在。但是jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录底下的jvm.dll。 4.两个JRE安装JDK时一定会在其子目录下面安装一个JRE,同时在安装的过程也会询问你是否要安装一个外部的JRE(在C:\Program Files\Java目录下)。如果我们选择安装则就同时拥有了两个JRE。这两个JRE其实功能上是没有任何分别的。 花费额外的硬盘空间在不同的目录下安装两个一模一样的JRE,并不是一种浪费。真正的原因是因为JDK里有很多用Java语言编写的开发工具(被存放在<jdk安装目录>\lib\tools.jar目录下)。JDK里面的工具几乎都是用Java所编写的,所以JDK本身就是一个Java程序,也就必须有一套JRE来执行这个JDK。因此<jdk安装目录>\jre下的那一套JRE是用来执行JDK这个Java程序的,而位于C:\Program Files\下的那套JRE才是用来执行我们所编写的Java程序。不过,两套中的任何一套JRE都可以用来执行我们所编写的Java程序,可以JDK内的开发工具在预设使用包装器(.exe)来启动的情况下,都会自己去选择<jdk安装目录>\jre底下的那套JRE。 1)jdk\jre:是用来运行这个JDK时用到的。2)C:\Program Files\Java\jre:是用来执行我们所编写的Java程序。 5.三个java.exe程序 我们会发现JDK下bin目录里有一个java.exe,然后外部JRE下bin目录里也有一个java.exe,当然JDK下的JRE里也包含了一个java.exe。那么问题来了,学挖机哪家强?哈哈,开个玩笑,最近被这个洗脑了。问题是我们起初在cmd里解释.class文件的时候到底运行了的哪一个java.exe呢? 先看外部的JRE在安装的时候会自动注册到操作系统的path(但在系统环境变量中的path中并没有包含该命令的路径值)里面一般是:System32文件夹下(该文件夹下包含:java.exe,javaw.exe,javaws.exe三个文件)面。因此我们只要安装了外部的JRE(即使JDK没有安装,环境变量没有配置)则运行Java程序时都是用的外部JRE的java.exe程序来运行的(即使安装了JDK且配置了环境变量,系统的默认path具有优先)。
对JDK,JRE,JVM的理解的更多相关文章
- 1、Java语言概述与开发环境——JDK JRE JVM理解
一.理解概念: 1.JDK(Java Development Kit Java开发工具包) JDK是提供给Java开发人员使用的,其中包含Java的开发工具,也包括JRE,所以安装了JDK,就不用单独 ...
- JDK,JRE,JVM区别与联系-理解与概括
我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析 ...
- JDK JRE JVM
使用java很久,但是一直不清楚JDK,JRE,JVM直接的关系,今天特地梳理一下. JDK:Java Development ToolKit(Java开发工具包),JDK是整个JAVA的核心,包括J ...
- JDK,JRE,JVM区别与联系(ZZ)
http://www.cnblogs.com/hencehong/p/3252166.html 我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JD ...
- JDK,JRE,JVM区别与联系
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...
- jdk jre jvm 关系
很多朋友可能跟我一样,已经使用JAVA开发很久了,可是对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天特写此文,来整理下三者的关系. JDK : Java Development ...
- JDK,JRE,JVM区别与联系(转)
JDK : JavaDevelopment ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具 ...
- 老李分享:JDK,JRE,JVM区别与联系
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- JDK,JRE,JVM的区别与联系
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...
随机推荐
- struct inode 和 struct file
1.struct inode──字符设备驱动相关的重要结构介绍 内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符.Linux2.6.27内核中,inode结构体具体定义如下: ...
- Objective-C命名编写规范
There are only two hard things in Computer Science: cache invalidation and naming things. 在计算机科学中只有两 ...
- 1137. Bus Routes(dfs)
1137 做过一样的 怎么又忘了 再一次搜超时 不用回溯 #include <iostream> #include<cstdio> #include<cstring> ...
- 1124. Mosaic(dfs)
1124 需要想那么一点点吧 一个连通块中肯定不需要伸进手不拿的情况 不是一个肯定会需要这种情况 然后注意一点 sum=0的时候 就输出0就可以了 不要再减一了 #include <iostre ...
- voliecty indexOf的写法
Velocity allows you to use all Java methods available in your objects. So just write as if it was Ja ...
- Akka的Actor模型及使用实例
本文的绝大部分内容转载自rerun.me这一blog,老外写的东西就是好啊. ACTORS介绍 Anyone who has done multithreading in the past won't ...
- bzoj3413
SAM好题,显然我们不能与每个后缀都去算LCP 考虑对询问串每一位算贡献,先构建出逆序构建自动机,这样我们得到了原串的后缀树(parent树) 根据parent树的定义,一个节点对应字符串出现的位置对 ...
- UVa 524 Prime Ring Problem【回溯】
题意:给出n,把从1到n排成一个环,输出相邻两个数的和为素数的序列 照着紫书敲的, 大概就是这个地方需要注意下,初始化的时候a[0]=1,然后dfs(1),从第1个位置开始搜 #include< ...
- js判断浏览器类型和内核
function judge() { var sUserAgent = navigator.userAgent.toLocaleLowerCase(); var isLinux = (String(n ...
- ASP.NET在IE10,IE11中Form表单身份验证失效问题解决方法
已经研究出解决方案. 在web.config中的forms中增加cookieless="UseCookies"属性即可. <authentication mode=&qu ...