Java虚拟机 - 初探JVM

本文概述了Java程序从源码到运行的流程,包括javac编译和JVM的角色。介绍了Java的发展历程,从1990年的Oak到现代的JDK版本。同时,详细讨论了JVM的架构,特别是HotSpot VM,解释器与JIT编译器的工作方式。此外,还阐述了JVM的生命周期,包括启动、执行和退出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总览Java程序的运行流程

在计算机系统体系中并不认识高级语言,需要转成汇编,再由转机器指令。
在这里插入图片描述
*.java文件通过 javac 编译成 *.class文件,通过 ClassLoader 加载到JVM经过链接阶段(暂时不懂可略过)后,在运行时通过解释器解释执行。
在这里插入图片描述

Java发展的重大事件

  • 1990年,在sun公司中,由Patrick naughton、mikesheridan以及james Gosling领导的小组Green Team,开发出新的程序语言,命名为OAK,后期更名为Java
  • 1995年,sun正式发布Java和hotJAVA产品,Java首次公开亮相。
  • 1996年1月23日sun Microsystems发布了JDK1.0.
  • 1998年,JDK1.2版本发布。同时,sun发布了JSP/Servlet、EJB规范,以及将Java分成了J2EE、J2SE和J2ME。这表明Java开始向企业、桌面应用和移动设备应用3大领域挺进。
  • 2000年,JDK1.3发布,Java HotSpot Virtual Machine正式发布,成为Java默认的虚拟机。
  • 2002年,JDK 1.4发布,古老的classic虚拟机退出历史舞台。
  • 2003年底,Java平台的scala正式发布,同年Groovy也加入了Java阵营。
  • 2004年,JDK1.5发布,同时JDK1.5改名为JavaSE5.0.
  • 2006年,JDK 6发布,同年Java开源并建立了openJDK,顺理成章,Hotspot虚拟机成为了OpenJDK中默认的虚拟机。
  • 2007年,Java平台迎来了新伙伴Clojure。
  • 2008年,Oracle收购了BEA,得到了JRockit虚拟机。
  • 2009年,Twitter宣布将后台大部分程序从ruby迁移到Scala,这是Java平台的有一次大规模应用。
  • 2010年,Oracle收购了sun,获得Java商标和最具价值的hotspot虚拟机。此时Oracle拥有市场占用率最高的两款虚拟机hotspot和JRockit,并且计划未来进行整合:HotRockit。
  • 2011年,JDK7发布,在JDK1.7u4中,正式启用了新的垃圾回收器G1.
  • 2017年,JDK9发布,将G1设置为默认GC,替代CMS。
  • 2017同年,IBM的J9开源,形成了现在的open J9社区。
  • 2018年,Android的Java侵权案判决,Google公司赔偿Oracle总计88亿美元。
  • 2018同年,Oracle宣布JavaEE成为历史名词,JDBC、JMS、Servlet赠与Eclipse基金会。
  • 2018同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK授权许可。
  • 2019年,JDK12发布,加入RedHat领导开发的shenandoah GC。
  • 在JDK11之前,OracleJDK还会存在一些openJDK中没有的、闭源的功能。但在JDK11中,openJDK和OracleJDK代码实质上已经达到完全一致的程度。

JVM的整体结构

HotSpot VM是目前市面上性能虚拟机的代表作之一,解释器与即时编译器并存
在这里插入图片描述

Java代码执行流程

我们编写的Java源码首先经过Java编译器(也称前端编译器),只要其中一个编译的环节出现了问题都不能正常生成字节码文件。
在这里插入图片描述

解释器(解释执行)和JIT编译器(编译执行):

解释器:保证响应时间,运行时对字节码指令进行逐行解释执行。

JIT编译器:二次编译,将热点代码直接编译成机器指令,并把这些机器指令缓存起来。

JVM的架构模型

java编译器输入指令流是基于栈的指令集架构,另外一种指令架构基于寄存器指令集架构。

基于栈的指令集架构特点

1.设计和实现更简单,适用于资源受限的系统;(栈的资源有限)

2.避开了寄存器的分配难题:使用的是零地址指令分配方式(零地址指令:只有操作数,没有地址指向操作数)

3.指令流中大部分指令是零地址指令,执行过程依赖于栈操作。

优点:指令集合小,编译器容易实现。

缺点:完成一项操作需要更多的指令完成(栈的原因导致),效率低。

4.不需要硬件的支持,可移植性好,利于跨平台(没有和硬件挂钩)

基于寄存器指令集架构特点

1.典型应用:传统pc以及android的Davlik虚拟机

2.指令集架构依赖于硬件,可移植性差

3.性能优秀,执行效率高(因为花费更少的指令去执行一个操作)

4.大部分情况下,寄存器指令集往往都是一地址指令、二地址指令和三地址指令为主(指令集合大)

JVM的生命周期

JVM启动 -> 执行 -> 退出。

JVM启动

Java 虚拟机的启动是通过引导类加载器(Bootstrap ClassLoader )创建一个初始类(Initial Class)来完成的这个类是虚拟机的具体实现来指定的。

JVM执行

  • 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
  • 程序开始执行时它才运行,程序结束时它就停止。
  • 执行一个Java程序的时候,真正在执行的是一个Java虚拟机的进程。

JVM退出

有如下几种情况:

  • 程序正常结束
  • 程序在执行过程中遇到了异常或错误而异常终止。
  • 由于操作系统出现错误而导致Java虚拟机进程终止。
  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
  • 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值