对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工 ...
随机推荐
- redhat6和ubuntu13.10在WMware player 下与Windows共享文件
Redhat下: 点击VMware的 setting -> vmware tools install mount /dev/cdrom /mnt/cdromcd /mnt/cdrom里面有一个v ...
- BZOJ 2337 XOR和路径(高斯消元)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2337 题意:给定一个带权无向图.从1号点走到n号点.每次从当前点随机(等概率)选择一条相 ...
- JVM参数配置
JVM参数配置 设置堆大小 -Xms 初始堆大小 -Xmx 最大堆大小 -Xmn 设置年轻代大小 设置每个线程堆栈大小 -Xss 设置每个线程的堆栈大小 设置年轻代大小 -XX:NewSize= -X ...
- window注册表
打开注册表: 可以用快捷键 win + r ,然后输入 Regedit 回车,会打开注册表. 注册表添加一个键值对到 操作如下: 1.先创建一个 .reg 后缀的文件. 2.文件内容如下: Wind ...
- 对于oracle监听器的配置
oracle 的 net configuration assist中配置完第一项的监听程序配置(对应文件listener.ora)之后,还要重新配置下第三项本地网络服务名配置(对应文件tnsname ...
- Qt之进程间通信(IPC)
简述 进程间通信,就是在不同进程之间传播或交换信息.那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是& ...
- Dapper使用在WCF上总是说Service找不到
原因是用Console Application 做宿主的时候,创建的时候默认是Client Profile 4 ,坑爹啊.改成Net framework 4 即可.
- ASP.NET中POST提交数据并跳转页面
需求:先Post提交数据,然后跳转到目标页面 找了好久才发现这个神奇的类HttpHelper.原理很简单,利用html的from表单拼接,然后执行 使用方法: NameValueCollection ...
- Vagrant工具
Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史. 我们可以通过 Va ...
- MYSQL查询数据库表索引的硬盘空间占用
查询数据库的占用 SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' , CONCA ...