JDK和JRE有什么区别?
JDK (Java Development Kit)—— Java 开发工具包
用途:JDK是用于Java应用程序的工具包,包含了编写、编译、调试、和运行Java程序所需要的所有工具。
包含内容:
- JRE: JDK包含了一个完整的JRE,用于运行Java程序。
- 开发工具:JDK提供了编译器(javac)、调试工具、文档生成器(javadoc)、打包工具(jar)等开发工具、这些工具用于将Java代码编译成字节码(.class文件),并进行调试、打包等操作。
- 标准库:JDK提供了丰富的Java类库,支持开发各种类型的Java应用程序。
JRE (Java Runtime Environment)—— Java 运行时环境
用途:JRE是用于运行Java应用程序的环境。它提供了Java程序所需要的核心库和JVM(Java VIrtual Machine)。
包含内容:
- JVM: JRE,用于将编译后的字节码(.class文件)解释生成机器代码,并在不同的操作系统上执行。
- 核心类库:JRE提供了Java应用程序运行所需的核心库类,例如java.lang、java.util等。
- 其他库:包含图形用户界面库(AWT和Swing)、I/O库等,支持不同类型的Java应用程序的运行。
工作流程
- JDK:开发者使用JDK编写Java源代码(.java文件),然后通过JDK提供的编译器将源代码编译成字节码(.class文件)。编译后的字节码可以使用JDK或JRE来运行。
- JRE:JRE负责加载.class文件,将字节码通过JVM解释执行或者JIT(Just-in-time)编译成机器代码,从而在操作系统上运行。
即时编译(Just-In-Time Compilation,JIT)是一种将程序在运行时动态地编译成机器代码的编译技术。相对于传统的静态编译,即时编译将编译过程延迟到程序执行的时候进行,而不是在程序执行之前。这种方法允许编译器根据程序运行时的上下文信息来进行优化,从而提高程序的性能。
文件结构
- JDK:
- bin.: 包含了编译(javac)、解释器、调试器(jdb)等开发工具的可执行文件。
- lib/:包含了开发时需要的库文件和工具的类库。
- include/:包含了使用JNI(Java Native Interface)的头文件,方便C/C++代码进行交互。
- jre/:JDK内部的JRE文件夹,包含了JRE所需要的所有内容,如JVM和核心类库。
- JRE:
- bin/:包含了运行Java应用程序的可执行文件,如java。
- lib/:包含了Java应用程序运行时所需的类库和资源文件。
- ext/:扩展库文件夹,允许开发者或应用程序添加额外的库。