深入浅出Java虚拟机(一)——走近JVM

1. Java虚拟机介绍

在这里插入图片描述
如图是官网对Java虚拟机的描述

Java虚拟机是Java平台的基石。它是技术的组成部分,负责硬件和操作系统的独立性,编译代码的小巧大小以及保护用户免受恶意程序侵害的能力。

Java虚拟机是抽象的计算机。像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。使用虚拟机实现编程语言是相当普遍的。最知名的虚拟机可能是UCSD Pascal的P代码计算机。

由Sun Microsystems,Inc.完成的Java虚拟机的第一个原型实现模拟了由类似于现代个人数字助理(PDA)的手持设备托管的软件中的Java虚拟机指令集。Oracle当前的实现在移动设备,桌面设备和服务器设备上模拟Java虚拟机,但是Java虚拟机不采用任何特定的实现技术,主机硬件或主机操作系统。它不是固有解释的,但是也可以通过将其指令集编译为硅CPU的指令集来实现。它也可以用微码或直接在硅中实现。

Java虚拟机对Java编程语言一无所知,仅对特定的二进制格式(class文件格式)一无所知。一个class文件包含的Java虚拟机指令(或字节码)和符号表,以及其它辅助信息。

为了安全起见,Java虚拟机对class文件中的代码施加了严格的语法和结构约束。但是Java虚拟机可以托管任何具有可用有效文件表示的功能的语言。受通用的,独立于机器的平台的吸引,其他语言的实现者可以将Java虚拟机用作其语言的交付工具。

此处指定的Java虚拟机与Java SE 8平台兼容,并支持Java语言规范Java SE 8 Edition中指定的Java编程语言。

1.1 Java跨平台的语言

众所周知:一次运行,处处运行

图1

1.2 JVM跨语言的平台

图3

  • 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虛拟机平台上运行非Java语言编写的程序。

  • Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。

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

  • 特点

  • 一次编译,到处运行

  • 自动内存管理

  • 自动垃圾回收功能

图4
如图JVM是运行在操作系统上的,它与硬件没有直接交互

1.3 Java整体结构

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

图5

1.4 Java代码执行流程

图6

1.5 Java的栈结构

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是 HotspotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢子栈跨平台性、指令集小、指令多;执行性能比寄存器差?

因为栈具有以下优点:

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

2. Java虚拟机运行过程

2.1 虚拟机的启动

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

2.2 虚拟机的执行

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

2.3 虚拟机的退出

有如下的几种情况

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

3. JVM发展历程

SUN公司的 Hotspot VM

  • Hotspot历史最初由一家名为“ Longview Technologies"的小公司设计

  • 1997年,此公司被sun收购;2009年,sun公司被甲骨文收购

  • JDK1.3时, Hotspot VM成为默认虚拟机

  • 日前 Hotspot占有绝对的市场地位。

    不管是现在仍在广泛使用的JDK6,还是使用比例较多的JDK8中,默认的虚拟机都Hotspot
    从服务器、桌而到移动端、嵌入式都有应用。
    名称中的Hotspot指的就是它的热点代码探测技术通过计数器找到最具编译价值代码,触发即时编译或栈上替换通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。

TaobaoJVM

由AliJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品基于 OpenJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。

  • 基于 OpenJDK Hotspot V发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机。

  • 创新的GCIH( GC invisible heap)技术实现了off-heap,即将生命周期较长的Java对象从heap中移到heap之外,并且Gc不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。

  • GCIH中的对象还能够在多个Java虛拟机进程中实现共享使用crc32指令实现JVM intrinsic降低JNI的调用开销

  • PMU hardware的 Java profiling tool和诊断协助功能。

    应用在阿里产品上性能高,硬件严重依赖 intel的cpu,损失了兼容性,但提高了性能。日前已经在淘宝、天猫上线,把 Oracle官方JVM版木全部替换了。

该系列学习笔记学习自《深入理解java虚拟机》和尚硅谷JVM教程等,再次感谢。

猜你喜欢

转载自blog.csdn.net/kilotwo/article/details/104167302