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

基础面试题: JDK 和 JRE

1.定义

JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

2. 区别

JRE主要包含:java类库的class文件(都在lib目录下打包成了jar)和虚拟机(jvm.dll);

JDK主要包含:java类库的 class文件(都在lib目录下打包成了jar)并自带一个JRE。那么为什么JDK要自带一个JRE呢?而且jdk/jre/bin下的client 和server两个文件夹下都包含jvm.dll(说明JDK自带的JRE有两个虚拟机)。

3. 难点

如果安装了JDK,会发现你的电脑有两套JRE,一套位于C:\Program Files\Java\jre7, 另外一套位于 C:\Program Files\Java\jdk1.7.0_72\jre目录下。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java
PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。

4. 问题

a、为什么Sun要让JDK安装两套相同的JRE?
这是因为JDK里面有很多用Java所编写的开发工具,如javac.exe、jar.exe等,这些命令放置在 C:\Program Files\Java\jdk1.7.0_72\bin目录里。
因为他们是java编写的命令,所以要依靠java的jar包,这些jar包存放在C:\Program Files\Java\jdk1.7.0_72\lib目录里
如果将C:\Program Files\Java\jdk1.7.0_72\lib\目录里面的tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果:
Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac /Main
但是输入 java -cp C:\Program Files\Java\jdk1.7.0_72\lib\tools1.jar com.sun.tools.javac.Main
会得到与javac.exe相同的结果。
从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。
而且我们可以发现C:\Program Files\Java\jdk1.7.0_72\bin目录下的程序都很小,不大于29K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于C:\Program Files\Java\jdk1.7.0_72\jre目录下的那套JRE就是用来运行一般Java程序用的。

b、如果一台电脑安装两套以上的JRE,谁来决定呢?
这个重大任务就落在java.exe身上。java.exe的工作就是找到合适的JRE来运行Java程序。java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。

相关文章:

  • 基础面试题:java内存区域
  • 基础面试题:String StringBuffer 和 StringBuilder 的区别
  • 将Heap RID转换成RID格式
  • 数据库增删改查因文本包含sql语句造成语法错误问题解决方法
  • 基础面试题:== 与 equals 详解
  • 用ArrayList(解决约瑟夫问题)
  • 基础面试题:程序, 进程,线程,纤程,管程,超线程详解
  • 基础面试题:hashCode 与 equals
  • 2017.04.19 有趣的机械原理图
  • 详解TCP的三次握手与四次挥手及面试题(很全面)
  • 笔记APP中的TOP5
  • 深入理解BIO、NIO、AIO以及应用场景
  • 二分查找 Day08
  • QPS、TPS、并发用户数、吞吐量
  • Java创建多线程的四种方式以及优缺点
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 「面试题」如何实现一个圣杯布局?
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android组件 - 收藏集 - 掘金
  • CentOS6 编译安装 redis-3.2.3
  • Hibernate【inverse和cascade属性】知识要点
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Javascript Math对象和Date对象常用方法详解
  • Java多态
  • Java反射-动态类加载和重新加载
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • vue:响应原理
  • 从0到1:PostCSS 插件开发最佳实践
  • 码农张的Bug人生 - 初来乍到
  • 前端_面试
  • 前言-如何学习区块链
  • 一、python与pycharm的安装
  • 移动端 h5开发相关内容总结(三)
  • const的用法,特别是用在函数前面与后面的区别
  • gunicorn工作原理
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (4) PIVOT 和 UPIVOT 的使用
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (三)Honghu Cloud云架构一定时调度平台
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (实战篇)如何缓存数据
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 物件導向與老子思想 (OO)
  • (转)程序员疫苗:代码注入
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)Linux网络编程入门
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福