目录

  • 第1章 Java虚拟机概述
    • 1.1 虚拟机与Java虚拟机
    • 1.2 JVM
      • 1.2.1 JVM的位置
      • 1.2.2 JVM的整体结构
      • 1.2.3 Java代码执行流程
      • 1.2.4 JVM的架构模型
      • 1.2.5 JVM的生命周期
        • 虚拟机的启动
        • 虚拟机的执行
        • 虚拟机的退出
      • 1.2.6 JVM发展历程
        • Sun Classic VM
        • Exact VM
        • oracle :HotSpot VM
        • JRockit--服务端
        • IBM的J9
        • Taobao JVM
        • Graal VM

第1章 Java虚拟机概述

1.1 虚拟机与Java虚拟机

虚拟机:虚拟的计算机,是一款软件来执行一系列计算机指令,可分为系统虚拟机和程序虚拟机
系统虚拟机:Visual BOX, VMware,对物理计算机的仿真,提供可运行完整操作系统的平台
程序虚拟机:JVM, 为执行单个计算机程序而设计,执行的指令为Java字节码指令

无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

  • JVM:执行Java字节码的虚拟计算机,Java字节码可以由其他语言编译
    跨平台性、优秀的垃圾回收系统、可靠的及时编译器

  • 优点:跨平台性、自动内存管理、自动垃圾回收

1.2 JVM

1.2.1 JVM的位置


Java的体系结构

1.2.2 JVM的整体结构

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

    执行引擎包含三部分:解释器,及时编译器,垃圾回收器

1.2.3 Java代码执行流程

1.2.4 JVM的架构模型

Java编译器输入的指令流基本是一种基于栈的指令集架构(HotSpot),另一种指令集架构是基于寄存器的指令集架构

栈式架构特点

  • 设计实现更简单,适用于资源受限系统
  • 避开寄存器的分配难题:使用零地址指令
  • 指令流中的指令大部分是零地址指令,其执行过程依赖操作栈,指令集更小,编译器易实现
  • 可移植性好
  • 指令多,指令集小

栈顶缓存技术
HotSpot中将栈顶元素全部缓存物理CPU的寄存器中,以此降低对内存的读/写次数,提升执行引擎的执行效率

寄存器架构特点

  • 典型的是X86的二进制指令集:传统PC(2020年苹果发布ARM架构笔记本)
  • 指令集架构依赖硬件,可移植性差
  • 性能优秀和执行高效
  • 花费更少的指令去完成一项操作
  • 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主

举例
同样执行2+3这种逻辑操作,其指令分别如下:

基于栈的计算流程(以Java虚拟机为例):

iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈

而基于寄存器的计算流程

mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3

总结
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

1.2.5 JVM的生命周期

虚拟机的启动

通过引导类加载器创建一个初始类来完成,这个类由虚拟机指定

虚拟机的执行

程序开始执行时运行,结束时结束,真正执行的是一个叫Java虚拟机的进程

虚拟机的退出

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

1.2.6 JVM发展历程

Sun Classic VM

  • 早在1996年Java1.0版本的时候,Sun公司发布了一款名为sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。
  • 这款虚拟机内部只提供解释器。现在还有及时编译器,因此效率比较低,而及时编译器会把热点代码缓存起来,那么以后使用热点代码的时候,效率就比较高。
  • 如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
  • 现在hotspot内置了此虚拟机。

Exact VM

为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。 Exact Memory Management:准确式内存管理

  • 也可以叫Non-Conservative/Accurate Memory Management
  • 虚拟机可以知道内存中某个位置的数据具体是什么类型。

具备现代高性能虚拟机的维形

  • 热点探测(寻找出热点代码进行缓存)
  • 编译器与解释器混合工作模式
    只在solaris平台短暂使用,其他平台上还是classic vm,英雄气短,终被Hotspot虚拟机替换

oracle :HotSpot VM

HotSpot历史

  • 最初由一家名为“Longview Technologies”的小公司设计
  • 1997年,此公司被sun收购;2009年,Sun公司被甲骨文收购。
  • JDK1.3时,HotSpot VM成为默认虚拟机

目前Hotspot占有绝对的市场地位,称霸武林。

  • 不管是现在仍在广泛使用的JDK6,还是使用比例较多的JDK8中,默认的虚拟机都是HotSpot
  • Sun/oracle JDK和openJDK的默认虚拟机
  • 默认介绍的虚拟机都是HotSpot,相关机制也主要是指HotSpot的Gc机制。(比如其他两个商用虚机都没有方法区的概念)
  • 从服务器、桌面到移动端、嵌入式都有应用。

名称中的HotSpot指的就是它的热点代码探测技术。

  • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
  • 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡

JRockit–服务端

专注于服务器端应用

  • 它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行。
  • 大量的行业基准测试显示,JRockit JVM是世界上最快的JVM。
  • 使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了70%)和硬件成本的减少(达50%)。

优势:全面的Java运行时解决方案组合

  • JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
  • MissionControl服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。

2008年,JRockit被oracle收购。

oracle表达了整合两大优秀虚拟机的工作,大致在JDK8中完成。整合的方式是在HotSpot的基础上,移植JRockit的优秀特性。

IBM的J9

全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9

市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM广泛用于IBM的各种Java产品。

目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的Java虚拟机。

2017年左右,IBM发布了开源J9VM,命名为openJ9,交给EClipse基金会管理,也称为Eclipse OpenJ9

OpenJDK -> 是JDK开源了,包括了虚拟机

Taobao JVM

由AliJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。

基于openJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。

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

  • 创新的GCIH(GCinvisible heap)技术实现了off-heap,即将生命周期较长的Java对象从heap中移到heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升Gc的回收效率的目的。
  • GCIH中的对象还能够在多个Java虚拟机进程中实现共享
  • 使用crc32指令实现JVM intrinsic降低JNI的调用开销
  • PMU hardware的Java profiling tool和诊断协助功能
  • 针对大数据场景的ZenGcV
    taobao vm应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能

目前已经在淘宝、天猫上线,把oracle官方JvM版本全部替换了。

Graal VM

2018年4月,oracle Labs公开了GraalvM,号称 “Run Programs Faster Anywhere”,勃勃野心。与1995年java的”write once,run anywhere"遥相呼应。

GraalVM在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言” 的运行平台使用。语言包括:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R等

支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件

工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。

如果说HotSpot有一天真的被取代,Graalvm希望最大。但是Java的软件生态没有丝毫变化。

JVM学习笔记0:Java虚拟机概述相关推荐

  1. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  2. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  3. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  4. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  5. 【学习笔记】Java虚拟机(二)内存区域与内存溢出

    运行时数据区域 根据<Java虚拟机贵发(Java SE 7版本)>的规定,Java虚拟机所管理的内存包含以下几个运行时 数据区域.借图: 1.程序计数器 程序计数器(Program Co ...

  6. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  7. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  8. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  9. 学习笔记:Java 并发编程②_管程

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

最新文章

  1. jQuery绑定事件的三种常见方式(bind、one、【change、click、keydown、hover】)
  2. Vue.js 跟踪对象新增属性
  3. python读取文件某一行-使用python读取.text文件特定行的数据方法
  4. 在Android Studio中进行代码混淆
  5. Flume案例:模拟两个agent之间传递消息的场景
  6. 用备份进行Active Directory的灾难重建:Active Directory系列之三
  7. 关于.NET HttpClient方式获取微信小程序码(二维码
  8. sessionStorage和localStorage的用法,不同点和相同点
  9. jest.conf.js_如何在Jest中正确模拟Moment.js / dates
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上相册展示系统
  11. Spring事务管理(二)-TransactionProxyFactoryBean原理
  12. 切 5G 的蛋糕?先练好内功吧
  13. 如何控制Nginx并发连接数,Linux 内核优化
  14. android详细信息java.util.ConcurrentModificationException变态
  15. 人月神话阅读笔记(2)
  16. C语言 55555图形 找车牌问题
  17. 智能机器人_微分平坦与最小化加加加速度
  18. android 解码 gif 时间,Android 平台实现Gif 图像解码并播放代码及组件
  19. Java实现图片转化为pdf
  20. 报错:NavigationDuplicated: Avoided redundant navigation to current location(跳转了重复路由)

热门文章

  1. 基于深度学习的图像识别算法研究
  2. 自建es集群数据迁移同步到腾讯云
  3. kali息屏时间设置
  4. h5微信公众号获取发票抬头功能总结
  5. 【建议收藏】7 个“最佳”AI 视频生成器
  6. Qt基本绘图:用画家QPainter画线条和矩形
  7. 【AI实战】动手实现人脸识别程序
  8. blog, microblog, wechat
  9. 炉石传说显示无法连接服务器失败,《炉石传说》无法连接到战网解决方法 无法连接请检查网络连接如何快速解决...
  10. 创业:90后创业者你有霸气吗