avatar

一条在知识海洋的咸鱼

这个家伙很懒,啥也没有留下😋

  • 首页
  • Linux
  • OCJP
  • Java核心技术卷
  • J2EE相关标准
  • 深入理解Java虚拟机
  • NIO与SOcket编程技术指南
  • Java多线程编程核心技术
  • Redis开发与运维
  • Spring Cloud Alibaba 微服务原理与实践
  • DevOps
  • Docker
  • MySQL必知必会
  • AI自学路线
  • Spring Boot 编程思想(核心篇)
主页 走进Java
文章

走进Java

发表于 2020-12-30 更新于 2026-06- 10
作者 Administrator
17~22 分钟 阅读
  • 概述
  • Java技术体系
    • JCP官方规定Java技术体系:
  • Java发展史
  • Java虚拟机家族
    • 虚拟机始祖:Sun Classic/Exaxt VM
      • Sun Classic VM(第一款商用Java虚拟机)
      • Exaxt VM
    • 武林盟主:HotSpot VM
    • 小家碧玉:Mobile/Embedded VM
    • 天下第二:BEA JRockit/IBM J9 VM
    • 软硬合璧:BEA Liquid VM/Azul VM
    • 挑战者:Apache Harmony/Google Android Dalvik VM
    • 没有成功,但并非失败:Microsoft JVM及其他
    • 百家争鸣
      • KVM
      • Java Card VM
      • Squawk VM
      • JavaInJava
      • Maxine VM
      • Jikes RVM
      • IKVM.NET
  • 展望Java技术的未来
    • 无语言倾向
    • 新一代即时编译器
    • 向Native迈进
    • 灵活的胖子
    • 语言语法持续增强
  • 实战:自己编译JDK
    • 获取源码
      • OpenJDK和OracleJDK之间的区别
      • 获取OpenJDK源码的方式

概述

Java不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范组成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛用于千余如系统、移动终端、企业服务器、大型机等多种场合

Java技术体系

从广义上讲,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系

JCP官方规定Java技术体系:

  • Java程序设计语言
  • 各种硬件平台上的Java虚拟机实现
  • Class文件格式
  • Java类库API
  • 来自商业机构和开源社区的第三方Java类库

JDK:把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit)
image.png

Java发展史

  • HotSpot虚拟机刚发布时是作为JDK1.2附加程序提供,称为JDK1.3及之后所有KDL版本的默认Java虚拟机
  • 2006年,Sun公司在JavaOne大会上,宣布计划把Java开源,并建立OpenJDK组织对这些源码进行独立管理
  • Sum被Oracle收购后,商业化浓重,每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版提供为期三年的支持和更新,普通版本只有六个月。JDK8和JDK11是LST版本
  • Oracle从JDK11起把以前的商业特性(JMC、JFR、NMT等)全部开源给OpenJDK。故OracleJDK 11和OpenJDK 11代码和功能本质上是完全相同的
  • RedHat(IBM小弟)从Oracle手上结果OpenJDK 8和OpenJDK 11的管理权力和维护职责

Java虚拟机家族

虚拟机始祖:Sun Classic/Exaxt VM

Sun Classic VM(第一款商用Java虚拟机)

只能使用纯解释器方式来执行Java代码,如果要使用即时编译器那就必须要进行外挂,但是假如外挂了即时编译器,则即时编译器就会完全接管虚拟机的执行系统,解释器便不能再工作了

Exaxt VM

因使用准确式内存管理(Exact Memory Management)而得名。准确式内存管理是指虚拟机可以知道内存中某个位置的数据具体是什么类型(引用类型还是其他类型)
只存在了很短时间被HotSpot VM 所替代

武林盟主:HotSpot VM

它是Sun/OracleJDK 和OpenJDK中的默认Java虚拟机。
HotSpot既继承了Sun之前两款商用虚拟机的有点(准确式内存管理)。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无需等待本地代码输出才能执行程序,及时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。
JDK8时期,HotSpot移除掉永久代,吸收了JRockit的Java Mission Control监控工具等功能

小家碧玉:Mobile/Embedded VM

面对移动和嵌入式市场,Java ME中的Java虚拟机处于比较尴尬的位置(Andrioid和IOS)。
国内的老人手机和出口到经济欠发达国家的功能手机还在广泛使用这种更加简单、资源消耗也更小的上一代Java ME 虚拟机(KVM)

天下第二:BEA JRockit/IBM J9 VM

EBA System公司的JRockit与IBM公司的IBM J9和HotSpot并称“三大商业Java虚拟机”

  • JRockit:专门为服务器硬件和服务端应用场景高度优化的虚拟机,内部不包含解释器实现,全部代码都靠即时编译器编译后执行
  • J9:全面考虑服务端、桌面应用,再到嵌入式的多用途虚拟机,如果为了学习虚拟机技术而去阅读源码,更加模块化的OpenJ9代码比HotSpot更适合阅读

软硬合璧:BEA Liquid VM/Azul VM

与特定硬件平台绑定、软硬件配合工作的专有虚拟机

挑战者:Apache Harmony/Google Android Dalvik VM

这两款确切的说只能称作虚拟机,而不能称作Java虚拟机

  • Apache Harmony:没有通过TCK认证(Technology Compatibility Kit 兼容性测试),所以不能用java虚拟机来代指
  • Google Android Dalvik VM:Dalvik虚拟机并不是一个Java虚拟机,没有遵循Java虚拟机规范,不能直接运行Java的Class文件,是哟个寄存器架构而不是Java虚拟机中常用的栈架构。但它执行的DEX(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写的应用程序,可以直接使用绝大部分的Java API

没有成功,但并非失败:Microsoft JVM及其他

Microsoft 为了IE3支持Java Applets应用开发的Java虚拟机,后应为Sun交涉被放弃

百家争鸣

KVM

简单、轻量、高度可移植,但是运行速度比较慢,在Android、IOS等只能手机操作系统出现前被广泛应用

Java Card VM

Java虚拟机的很小子集,可以放入智能卡、SIM卡、银行卡等内,负责对Java Applet程序进行解释执行

Squawk VM

由Sun开发,应用于Sun SPOT和Java Card

JavaInJava

Sun公司的实验性质虚拟机

Maxine VM

Jikes RVM

IKVM.NET

展望Java技术的未来

无语言倾向

Graal VM被官方称为"Universal VM"和"Polyglot VM",在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,包括基于Java虚拟机上的语言和C、C++、Rust等基于LLVM的语言和Python、R语言等

新一代即时编译器

对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上取决于即时编译器所输出的代码质量

向Native迈进

对不需要长时间运行的,或者小型化的应用语言,大型单体应用结构向小型微服务应用架构发展的技术潮流下,Java有一些劣势

灵活的胖子

HotSpot的定位是面向各种不同的应用场景的全功能Java虚拟机,HotSpot开发团队正在持续地重构着HotSpot的架构,让它具有模块化的能力和足够的开放性

  • JDK9 HotSpot虚拟机开放了Java语言级别的编译器接口
  • JDK10 HotSpot重构了Java虚拟机的垃圾收集器接口

语言语法持续增强

  • 语法糖
  • Project Loom:由软件自身进行调度的用户现场
  • Project Valhalla:提供值类型和基本类型的泛型支持,并提供明确的不可变类型和非引用类型的声明。
  • Project Panama:消弭Java虚拟机与本地代码之间的界限

实战:自己编译JDK

想要了解Java虚拟机内部的实现原理,直接一条路径就是编译一套自己的JDK,通过阅读和跟踪调试JDK源码来了解Java技术体系的运作。
Java类库里的很多底层方法都是Native的,在了解这些方法的运作过程,或对JDK进行Hack(根据需要进行定制微调)的时候,都需要有能自行编译、调试虚拟机代码的能力。

获取源码

OpenJDK和OracleJDK之间的区别

  • OpenJDK是Sun公司在2006年末把Java开源而形成的项目。源码仓库只包含了标准Java SE的源代码,而一些额外的模块,典型的如JavaFX,是存放在独立的源码仓库中
  • OracleJDK的安装包中会包含JavaFX这种独立的模块,而用OpenJDK的话则需要单独下载安装。
  • 在JDK11以前,OracleJDK还会存在一些OpenJDK没有的、闭源的功能,即OracleJDK的“商业特性”
  • 在JDK11及以后,二者代码实质上基本完全一致,我们所编仪的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的OracleJDK是一致的

获取OpenJDK源码的方式

  • 通过Mercurial代码版本管理工具从Repository中直接取得源码(访问速度较慢)
  • 直接在仓库中打包出源码压缩包,再进行下载
    http://hg.openjdk.java.net/jdk
    image.png
    image.png
    image.png
深入理解Java虚拟机
JVM
许可协议: 
分享

相关文章

1月 28, 2021

Java内存模型与线程

概述概述JVM如何实现多线程、多线程之间由于共享和和竞争数据而导致的一系列问题及解决方案多任务处理在许多场景下,让计算机同时去做几件事情1.因为计算机的运算能力强大2.计算机的运算速度比存储和通信速度大多了,太多的时间花费在磁盘I/O、网络通信或者数据库上除要充分利用计算机处理器能力,一个服务端要同

1月 28, 2021

虚拟机字节码执行引擎

概述虚拟机与物理机的区别运行时栈帧结构局部变量表概述执行引擎是JVM核心的组成部分之一虚拟机与物理机的区别物理机执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的虚拟机执行引擎由软件自行实现的,因此可以不受物理条件制约指令集和执行引擎的结构体系,能够执行不被硬件直接支持的指令集格式不同的VM

1月 26, 2021

虚拟机类加载机制

概述JVM类加载机制动态加载例子类加载的时机固定不变的步骤:除了解析之外类初始化种类被动引用举例接口的加载的区别类加载的过程加载zip压缩包中读取概述在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。JVM类加载机制Java虚拟机把描述类的数据从Class文件加载到内存

下一篇

no available service 'default' found, please make sure registry config correct

上一篇

MySQL体系结构和存储引擎

最近更新

  • 55 异常兜底:工具失败、非法输出、空检索与超时
  • 54 Agent Memory:短期记忆、用户上下文与摘要
  • 53 Human-in-the-loop:让关键动作暂停、确认与恢复
  • 52 工单 Tool:字段校验、创建结果与失败补偿
  • 51 订单 Tool:Mock、鉴权、状态解析与脱敏

热门标签

java基础 微服务 maven Spring Tomcat DDD Linux Linux基础 SQL基础 数据结构算法

目录

©2026 一条在知识海洋的咸鱼. 保留部分权利。

使用 Halo 主题 Chirpy