第一章、JVM和Java体系结构

 

    首先要知道计算机本身不识别高级语言, java程序需要经过解释编译成汇编语言,汇编语言再向下转化成0、1表示的二进制机器指令,CPU执行的是机器指令。

一、java及JVM简介

1.1、Java是夸平台的语言

  一次编译,到处运行,是因为不同的操作系统对java虚拟机都有各自的实现,java语言运行在java虚拟机上,与平台无关,java虚拟机屏蔽了操作系统差异性。

1.2、Java虚拟机是夸语言的平台

  任何语言编译成的class的字节码文件只要符合虚拟机规范要求,都可以在虚拟机上运行虚拟运行的是Class字节码文件,和java源文件没有关联。

二、虚拟机与Java虚拟机

所谓虚拟机,其实就是一台虚拟的机器,可以用来执行一系列虚拟的命令。大体上虚拟机可以分为两种:系统虚拟机和程序虚拟机。

  1. 系统虚拟机:是完全对物理计算机的仿真,可以说和一台真实的PC操作系统没什么区别。比如常用的 Vmare 以及 Visual Box 软件,通过这些软件能够模拟出具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
  2. 程序虚拟机:专门为执行单个计算程序而产生,最典型的就是Java虚拟机,在Java虚拟机中执行字节码文件命令。

                                                                                                                                                      JVM在计算机中所处的位置

三、JVM的整体结构

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

  1. Java栈又叫做jvm虚拟机栈

  1. 方法区(永久代)在jdk8中又叫做元空间Metaspace

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

    • 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代

    • 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代

    • 在JDK1.8之后JVM 已经将运行时常量池从方法区中移了出来,在Java堆(Heap)中开辟了一块区域存放运行时常量池。同时在 jdk 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域

四、java代码的执行流程

  •  javac命令叫做前端编译器,将java源文件编译成虚拟机能识别的字节码文件。
  • JIT编译器叫做后端编译器,将反复执行的字节码指令编译成计算机能识别的0、1表示的机器指令,缓存在方法区。

五、java的架构模型

栈的指令集架构和寄存器的指令集架构

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

    二者区别

    • 栈:适用于资源受限的场景、设计实现简单。跨平台性、指令集小、指令多;执行性比寄存器差

    • 寄存器:指令少

六、JVM的生命周期

6.1、启动

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

6.2、执行

  • 一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;

  • 程序开始执行的时候他才运行,程序结束时他就停止;

  • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。

6.3、退出

  • 程序正常执行结束

  • 程序异常或错误而异常终止

  • 操作系统错误导致终止

  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作

  • 除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

七、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的产品

posted @ 2020-08-18 20:30  jingdy  阅读(66)  评论(0编辑  收藏  举报