Java JDK是什么?JDK安装目录介绍
JDK是SUN提供的一套Java开发环境,全称JavaDevelopmentKit,简称JDK,它是整个Java的核心,其中包括Java编译器、Java运行工具、Java文档生成工具、Java打包工具等。
在JDK安装完毕后,会在硬盘上生成一个目录,该目录被称为JDK的安装目录,如图1所示。
图1 JDK目录结构
为了更好地学习JDK,初学者需要对JDK安装目录下的子目录及文件的作用有所了解,接下来分别对JDK安装目录下的子目录进行介绍。
● bin目录:该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe(打包工具)和javadoc.exe(文档生成工具)等。
● db目录:db目录是一个小型的数据库。从JDK 6开始,Java中引入了一个新的成员Java DB,这是一个纯Java实现、开源的数据库管理系统。这个数据库不仅很轻便,而且支持JDBC 4.0所有的规范,在学习JDBC时,不再需要额外地安装一个数据库软件,选择直接使用Java DB即可。
● include目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的。
● jre目录:此目录是Java运行时环境的根目录,它包含Java虚拟机,运行时的类包、Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具。
● lib目录:lib是library的缩写,意为Java类库或库文件,是开发工具使用的归档包文件。
● javafx-src.zip:该压缩文件内存放的是Java FX(Java图形用户界面工具)所有核心类库的源代码。
● src.zip:src.zip为src文件夹的压缩文件,src中放置的是JDK核心类的源代码,通过该文件可以查看Java基础类的源代码。
● README等说明性文档。
在上面的目录中,bin目录是一个非常重要的目录,在其目录中存放着很多可执行程序,其中最重要的就是javac.exe和java.exe,这两个文件的主要作用如下:
● javac.exe是Java编译器工具,它可以将编写好的Java文件编译成Java字节码文件(可执行的Java程序)。Java源文件的扩展名为.java,如“HelloWorld.java”,编译后生成对应的Java字节码文件,文件的扩展名为.class,如“HelloWorld.class”。
● java.exe是Java运行工具,它会启动一个Java虚拟机(JVM)进程,Java虚拟机相当于一个虚拟的操作系统,它专门负责运行由Java编译器生成的字节码文件(.class文件)。
Java 虚拟机是什么?——探秘 JVM 的核心机制!
Java 程序员在日常开发中都会接触到 JVM(Java Virtual Machine,Java 虚拟机)这个名词,但到底什么是 JVM 呢?它在 Java 语言的执行中扮演了什么样的角色?这篇文章将为你揭开 JVM 的神秘面纱。
JVM,全称 Java Virtual Machine,即 Java 虚拟机,是一种能够执行 Java 字节码的虚拟计算机。Java 有一句经典的口号:“Write Once, Run Anywhere”(一次编写,到处运行),而 JVM 正是实现这一特性的核心。
简单来说,JVM 是一个运行 Java 程序的引擎。它接收编译后的 Java 字节码,将其解释并转换为底层机器能够执行的指令,从而在不同的操作系统和硬件上无缝运行。这就意味着,无论是 Windows、Linux 还是 macOS,只要有对应的 JVM,Java 程序就可以在上面运行,而无需重新编译。
JVM 并不仅仅是一个“跑 Java 程序的工具”,它还承担了许多核心任务,比如内存管理、垃圾回收、多线程支持等,这些功能让 Java 程序在性能和稳定性上都有非常强的保障。
- 字节码执行:JVM 接收 Java 编译器生成的字节码,并将其转换成机器指令供 CPU 执行。
- 内存管理:JVM 内部将内存划分成不同区域(如堆、栈、方法区等),在程序运行过程中动态分配和管理内存,确保程序不会轻易出现内存泄露问题。
- 垃圾回收:Java 程序员无需手动释放内存,JVM 会自动识别并回收不再使用的对象,从而提升内存使用效率。
- 跨平台性:JVM 实现了与底层操作系统和硬件的隔离,只要安装了相应的 JVM,Java 程序就可以跨平台运行,极大地简化了软件的开发和部署。
JVM 的整个工作流程分为多个步骤,帮助 Java 程序从代码到可执行结果逐步完成:
- 编译:Java 源代码先通过编译器(javac)编译成字节码(.class 文件)。
- 类加载:JVM 的类加载器(Class Loader)将字节码加载到内存中,为执行作准备。
- 字节码验证:JVM 会验证字节码的合法性,确保程序没有违反 Java 安全规范,比如非法的内存访问等。
- 解释与优化:解释器将字节码逐条翻译为机器代码,但为了提升性能,JVM 还内置了即时编译器(JIT,Just-In-Time Compiler),将一些热点代码直接编译为本地机器代码,避免重复翻译,提升执行效率。
- 执行与垃圾回收:JVM 执行机器代码,同时进行垃圾回收,释放无用对象占用的内存空间。
为了更好地管理内存和性能,JVM 内部划分了多个内存区域:
- 堆(Heap):用来存储所有的对象实例和数组,是垃圾回收的主要区域。
- 栈(Stack):每个线程都有自己的栈,用来存储方法调用的栈帧(局部变量、操作数栈等),栈中的数据会随着方法调用和返回而自动清除。
- 方法区(Method Area):存储类的结构信息、方法的字节码、常量池等。JDK 8 后被称为元空间(Metaspace)。
- 程序计数器(PC Register):记录当前线程所执行的字节码行号,用于多线程切换时保存执行位置。
- 本地方法栈(Native Method Stack):为本地方法(如 JNI 调用)提供支持。
这种内存划分方式让 JVM 更好地控制程序运行过程中的内存分配和释放,保障了 Java 程序的性能和稳定性。
JVM 是 Java 生态的基础,正是因为 JVM 的存在,Java 才能具备强大的跨平台性。JVM 的垃圾回收、内存管理、性能优化等特性,使得 Java 程序能够在长时间运行后保持稳定,同时减少了开发者的内存管理负担。此外,许多其他语言(如 Scala、Kotlin)也依赖 JVM,充分说明了 JVM 在整个编程世界的核心地位。
JVM 作为 Java 的核心引擎,为 Java 程序提供了稳定的执行环境。它不仅让 Java 成为一种跨平台语言,还通过自动内存管理、垃圾回收等功能,极大地减轻了开发者的工作负担。如果说 Java 是一座建筑,那么 JVM 就是支撑它的地基,让每一个 Java 程序员都可以安心构建出强大的应用程序。理解 JVM 的核心概念和工作机制,对于提升 Java 技术能力具有重要的帮助。
Java虚拟机简介
做Java开发的都知道JVM(Java Virtual Machine),即Java虚拟机,简单来讲,它是用来运行Java程序的。经过一系列的发展,目前市场上有很多的JVM,最流行或者说使用最广泛的莫过于HotSpot了,它诞生于JDK1.2,使用至今。
JVM作为JDK的核心组成部分,随着JDK的版本一起发布的,不同的JDK版本中,可能存在不同的JVM,有时会出现多个JVM共存。下面是SUN/Oracle JDK中的JVM的发展历史
- Classic VM
1996年1月,JDK1.0版本发布,这个版本的Java虚拟机是Classic VM。
- HotSpot VM
1998年12月,JDK1.2版本发布。1999年4月,HotSpot虚拟机诞生,它是被SUN公司从另外一家小公司收购而来,此时它仅作为JDK1.2版本的附加程序,并非默认的虚拟机。2000年5月,JDK1.3版本发布,HotSpot VM称为默认的虚拟机。
- Exact VM
在JDK1.2版本中,先后曾并存过3个虚拟机,Classic VM,HotSpot VM,以及Exact VM,其中Exact VM只在SUN公司自己的Solaris平台上使用,它与HotSpot VM几乎是同时期的独立产品。
- Graal VM
2018年3月,JDK10发布。4月,Oracle公司公开的一款虚拟机Graal VM,它是在HotSpot基础上诞生的,符合Java SE 8标准的JVM,但目前还未整合进JDK中发布,有可能是下一代的JVM。
JVM的运行流程大致如下3个步骤
- .java源文件编译为.class字节码文件
- JVM将.class字节码文件编译为操作系统的机器码
- 机器码调用操作系统本地方法库的方法
JVM主要由4部分构成,如下示意图
- 类加载器子系统
用于将编译好的.class字节码文件加载到JVM中
- 运行时数据区
用于存储JVM运行过程中产生的数据,包括程序计数器、本地方法区、方法区、虚拟机栈、虚拟机堆
- 执行引擎
包括即使编译器和垃圾回收器。即时编译器用于将.class字节码编译成操作系统的机器码,垃圾回收器用于回收在运行过程中产生的不再使用的对象
- 本地接口库
用于调用操作系统的本地方法库,以完成具体的I/O操作。
JVM核心组成
在一个JVM进程中,允许同时并发多个线程执行任务。在JVM后台运行的线程主要有以下5类
- 虚拟机线程
此类线程在JVM到达安全点时出现。
- 周期性任务线程
即执行周期性任务而创建的定时器调度线程。
- 编译器线程
编译器线程会在JVM运行时,执行将字节码动态编译成操作系统机器码的任务
- 信号分发线程
接收发送给JVM的信号并调用JVM的方法
- GC线程
用来在JVM中回收垃圾的线程
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。