初识JVM
# Java技术体系
Java不仅仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
从广义上讲,Clojure、JRuby、Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员。如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分:
- Java程序设计语言;
- 各种硬件平台上的Java虚拟机;
- Class文件格式;
- JavaAPI 类库;
- 来自商业机构和开源社区的第三方Java类库;
我们可以把Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境。把Java API类库中的 Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environmen)。JRE是支持Java程序运行的标准环境。

# 认识JVM
JVM(Java Virtual Machine),Java虚拟机的缩写。它是JRE的一部分,是一种用于计算设备的规范,它是一个虚构出来的计算机。
JVM包括一套字节码指令集、寄存器、栈、堆、方法区等。Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,JVM屏蔽了与具体操作系统平台相关的信息,在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行,Java语言通过JVM实现了跨平台特性,一次编译到处运行。
下图为JDK、JRE、JVM的关系:

# Java虚拟机发展史
# Sun Classic VM
1996年1月23日,Sun公司发布JDK 1.0,Java语言首次拥有了商用的正式运行环境,这个JDK中所带的虚拟机就是Classic VM。它是世界上第一款商用Java虚拟机。
只能使用纯解释器方式来执行Java代码。
# Sun HotSpot VM
HotSpot VM 是Sun/Oracle JDK和Open JDK中默认携带的虚拟机,也是目前使用范围最广的Java虚拟机。
打开命令行,输入java -version你就能看到它的身影:

起初是一家小公司开发的,后来被Sun收购,Sun又被Oracle收购。HotSpot VM既继承了 Sun之前两款商用虚拟机(Classic VM和Exact VM)的优点,也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术。
这是我们需要重点学习的Java虚拟机。
# JRockit
号称世界上最快的java虚拟机,是BEA公司研发的。专注服务器端应用,其优势在于垃圾收集器和MissionControl服务套件。
# Liquid VM
Liquid VM即是现在的JRockit VE(Virtual Edition),它是BEA公司开发的,可以直接运行在自家Hypervisor系统上的 JRockit VM的虚拟化版本,Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如 文件系统、网络支持等。由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,如在线程调度时,不需要再进行内核 态/用户态的切换等,这样可以最大限度地发挥硬件的能力,提升Java程序的执行性能。
# Azul VM
Azul VM是Azul Systems 公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机。
# JDK目录及文件详解(jdk 1.8)
# bin
路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该路径下。以下工具只列举部分。
标准工具(这些工具是JDK的基础,用这些工具来编写应用程序):
| 工具 | 说明 |
|---|---|
| appletviewer.exe | 在没有web浏览器的情况下运行和调试applet |
| extcheck.exe | 检查Jar冲突的工具 |
| jar.exe | java文件压缩打包工具 |
| jdb.exe | Java调试器 |
| jdeps.exe | Java类依赖性分析器 |
| java.exe | Java运行工具,用于运行.class字节码文件或.jar文件 |
| javac.exe | 用于Java编程语言的编译器 |
| javadoc.exe | API文档生成器 |
| javah.exe | C头文件和stub函数生成器,用于编写native方法 |
| javap.exe | class文件反编译工具 |
安全类工具(这些工具用于设置系统的安全规则和生产可以工作在远端的安全规则下的应用程序):
| 工具 | 说明 |
|---|---|
| keytool.exe | 管理密钥库和证书 |
| jarsigner.exe | 生产和校验JAR签名 |
| policytool.exe | 管理策略文件的GUI工具,用于管理用户策略文件(.java.policy) |
国际化工具(这些工具可以帮助你创建可本地化的应用程序)
| 工具 | 说明 |
|---|---|
| native2ascii.exe | 本地编码到ASCII编码的转换器(Native-to-ASCII Converter),用于“任意受支持的字符编码”和与之对应的“ASCII编码和(或)Unicode转义”之间的相互转换。 |
诊断监控类工具(部分有图形界面,神器!)
| 工具 | 说明 |
|---|---|
| jcmd.exe | JVM诊断命令工具,将诊断命令请求发送到正在运行的Java虚拟机。 |
| jconsole.exe | 用于监控Java虚拟机的使用JMX规范的图形工具。它可以监控本地和远程JVM。它还可以监控和管理应用程序。 |
| jmc.exe | Java任务控制客户端(JMC,Java Mission Control),包含用于监控和管理Java应用程序的工具,而不会引入与这些工具相关联的性能开销。开发者可以使用jmc命令来创建JMC工具。 |
| jvisualvm.exe | 一种图形化工具,可在Java虚拟机中运行时提供有关基于Java技术的应用程序(Java应用程序)的详细信息。 Java VisualVM提供内存和CPU分析,堆转储分析,内存泄漏检测,MBean访问和垃圾收集。 |
# db
该路径是安装Java DB的路径,Java DB 是 Oracle 支持的 Apache Derby 开源关系数据库的发行版本。它通过 JDBC 和 Java EE API 支持标准的 ANSI/ISO SQL,Java DB 包括在 JDK 中。
# include
C 语言头文件,支持用Java本地接口和Java虚拟机接口来本机代码编程。
# lib
该路径下存放的是JDK工具命令的实际执行程序。(即bin中绝大部分命令运行的是lib中程序)
# jre\bin
开发工具可执行文件(部分与JAVA_HOME\bin重复)。JVM实现,路径为jre\bin\server\jvm.dll
# jre\lib
JRE要用的核心类库,属性设置,资源文件等。
项目加载的类库说明:

# Java代码怎么运行
我们写的是.java文件,需要通过javac编译,产生.class文件,class文件才可以被JVM识别。我们经常见到的.jar文件,其实就是.class文件的压缩包(减少文件个数,方便操作),被加载到JVM才可以运行。

红色部分是我们接下来要重点学习的部分。