JVM 从入门到精通(二)JVM和Java体系结构

写在前面:我是「云祁」,一枚热爱技术、会写诗的大数据开发猿。昵称来源于王安石诗中一句 [ 云之祁祁,或雨于渊 ] ,甚是喜欢。


写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 数据中台、数据建模、数据分析以及Flink/Spark/Hadoop/数仓开发 感兴趣,可以关注我的动态 https://blog.csdn.net/BeiisBei ,让我们一起挖掘大数据的价值~


每天都要进步一点点,生命不是要超越别人,而是要超越自己! (ง •_•)ง

一、Java 和 JVM 简介

1.1 Java:跨平台的语言

在这里插入图片描述

1.2 JVM:跨语言的平台

在这里插入图片描述
Java不是最强大的语言,但是JVM是最强大的虚拟机。

1.3 Java 及 JVM 历史上重大事件

在这里插入图片描述
在 JDK11之前,OracleJDK中还会存在一些OpenJDK中没有的、闭源的功能。但在JDK11中,我们可以认为OpenJDK和OracleJDK代码实质上已经完全一致的程度。

1.4 计算机系统当中JVM所处的位置

Java虚拟机

Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释 / 编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

特点

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收功能

JVM 的位置
在这里插入图片描述
Java代码的执行流程

在这里插入图片描述
Java一次编译,到处运行。

在这里插入图片描述

二、JVM的整体结构

在这里插入图片描述

  • HotSpot VM 是目前市面上高性能虚拟机的代表作之一。
  • 它采用解释器与即时编译器并存的架构。
  • 在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一教高下的地步。

1、方法区和堆区是所有线程共享的内存区域;而Java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

2、Java栈又叫做JVM虚拟机栈

3、方法区(永久代)在JDK1.8中又叫做元空间Metaspace

方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT编译器,英文写作Just-In-Time Compiler)编译后的代码等数据。虽然Java虚拟机规范把- 方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

  • 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代
  • 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代
  • 在JDK1.8之后JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。同时在JDK1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域

4、Java代码执行流程:

Java程序 —>(编译javac)—> 字节码文件.class —> 类装载子系统化身为反射类Class —> 运行时数据区 —>(解释执行)—> 操作系统(Win、Linux、Mac JVM)

三、JVM的架构模型

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

由于跨平台的设计,Java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的

二者区别:

栈:跨平台性、指令集小、指令多;执行性比寄存器差
寄存器:指令少

一些简单查看命令:

//查看指令集命令代码
cd out/production/类根目录

//反编译
javap -v StackStruTest.class

//打印程序执行的进程
jps

四、JVM的生命周期

4.1 启动

通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

4.2 执行

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

4.3 退出

  • 程序正常执行结束
  • 程序异常或错误而异常终止
  • 操作系统错误导致终止
  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
  • 除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

五、JVM的发展历程

古今JVM

  • SUN Classic
  • Exact VM
  • HotSpot VM :HotSpot指热点代码探测技术
  • BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一
  • IBM J9
  • Taobao JVM: 目前已经在淘宝、天猫上线,替换了- Oracle官方JVM;
  • Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品

Android虚拟机 DVM

  • 谷歌开发,基于Android,在2.2中提供了JIT
  • 只能称作虚拟机 不能称为Java虚拟机,他没有遵循Java虚拟机规范
  • 基于寄存器架构,效率高,但是跟硬件耦合度比较高
  • 不能直接执行class文件,执行的是dex文件
  • 5.0使用支持提前编译的ART VM替换Dalvik VM

猜你喜欢

转载自blog.csdn.net/BeiisBei/article/details/106585737
JVM