JVM上篇:JVM与Java体系结构
JVM笔记
JVM传言
Java不是最强大的语言,但是JVM是最强大的虚拟机
虚拟机分类
系统虚拟机
类似VMware,就属于系统虚拟机,它提供了一个可运行完整操作系统的平台
程序虚拟机
Java虚拟机,它专门为执行单个计算程序而设计,在JVM中执行的指令称为Java字节码指令
JVM作用
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器执行执行。
JVM的特点
- write ones,run Anywhere!
- 自动内存管理
- 自动垃圾回收功能
JVM的位置
JVM整体的结构(HotSpot虚拟机)
JAVA程序的执行流程
JIT编译器
主要负责将热点代码(即重复运行的代码,把它直接编译为机器指令)
JVM的架构模型
Java编译器输入的指令流基本上上是一种基于栈的指令集架构。另外一种指令集架构则是基于寄存器的指令集架构。
两种架构的区别:
- 基于栈的架构
- 设计实现简单,适用于资源受限的系统
- 避开了寄存器分配的难题:使用零地址指令方式分配
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现。
- 栈是内存的一部分,不需要其他硬件的支持,可移植性好,跨平台性好
栈和寄存器
- 内存是CPU和硬盘之间的通道
- 内存如同一个仓库,堆,栈是仓库中开辟的一个规则有序的仓库区,而寄存器就是生产线上的一个容器
- 堆,栈是属于内存区的一部分,堆,栈是内存中的一种数据结构
- 而寄存器则是CPU中的一部分。寄存器是CPU的存储器.速度快
JVM的生命周期
启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始的类(initial class)来完成的。
虚拟机的执行
- 一个运行中的Java虚拟机有一个清晰的任务:执行Java程序
- 程序开始JVM开始运行,程序结束,JVM也随之结束
- 执行一个所谓的Java程序的时候,真真正正执行的是一个Java虚拟机的进程
退出
- 程序正常退出
- 程序在执行过程中遇到异常或错误
- 操作系统错误,导致java虚拟机进程终止
- 某线程调用System.exit()方法退出
JVM发展历程
java1.0 -> Sun Classic VM
1.1996年java1.0版本,sun公司发布了Sun Classic VM这个虚拟机,它是世界上第一款商用的Java虚拟机,jdk1.4被淘汰。
2.这款虚拟机的内部只提供解释器
3.可以外挂JIT编译器,但是解释器和编译器无法同时工作
4.现在的Hotspot内置了Sun Classic VM虚拟机
解释器和编译器:
1.解释器:逐行解释字节码为机器指令,逐行执行
2.编译器:遇到重复性执行的代码,编译器可将其直接编译为机器指令,并缓存起来,用来重复使用
java1.2 -> Sun Exact VM
1.虚拟机可以知道内存中某个位置的数据具体是什么类型
2.编译器和解释器混合工作模式
3.只在solaris平台被短暂使用,后被hotspot虚拟机替换
java1.3 -> HotSpot VM
1.此虚拟机最初由Longview Technologiew公司设计,1997年被sun收购,2009年sun被orical收购。
2.jdk1.3时,HotSpot称为默认的虚拟机
3.名称中的HotSpot指的就是它的热点代码探测技术,通过计数器找到最具有编译价值的代码,触发即时编译或者栈上替换
4.通过编译器和解释器协同工作,更高效的运行代码
5.每个端都适用
(Oracle)BEA JRockit
1.专注于服务器端的应用,因此JRockit内部不包含解释器的实现,全部代码都考即时编译器编译后执行。
2.大量行业基准测试显示,JRockit JVM是世界上最快的JVM。
3.优势:面向演示敏感型应用的解决方案JRockit Real Time,适合财务,军事
4.MissionControl服务套件,它是一组以极低的开销来监控,管理,和分析生产环境中的应用程序的工具
5.Orcale收购了BEA,整合了两大优秀虚拟机有点,大致在JDK8中完成,整合的方式是在HotSpot的基础上,一直JRockit的优秀特性。
IBM J9
1.全称:IBM Technology for Java Virtual Machine 简称IT4J,内部代号J9
2.市场定位与HotSpot接近,服务端、桌面应用,嵌入式等多用途
3.广泛用于IBM的各种JAVA产品
4.目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的Java虚拟机
5.2017年左右,IBM发布了开源J9 VM,命名为OpenJ9,交给Eclipse基金会管理,也称为Eclipse OpenJ9
KVM和CDC/DLDC HotSpot
1.Orcale在 Java ME产品线上的两款虚拟机
2.市场定位比较尴尬,智能收集被ios和Android二分天下
Azul VM and BEA Liquid VM
1.前面三大虚拟机,使用在通用的硬件平台上
2.Azul VM 和BEA Liquid VM是与特定的硬件平台绑定,软硬件配合使用的,配合起来特别猛
TaobaoJVM
1.由AliJVM 团队发布。 介于openJDK 开发了自己的定制版本AlibabaJDK,简称AJDK
2.是国内发布的第一个优化,深度定制且开源的高性能服务器版Java虚拟机。
3.创新的GCIH(gc invisble heab)技术实现了off-heap,即将生命周期较长的Java对象从heap中移到heap外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。
4.GCIH 中的对象还能在多个Java虚拟机进程中实现共享
5.使用Crc32 指令实现JVM intrinsic ,降低JNI 的调用开销
6.针对大数据场景的ZenGC
7.已在淘宝,天猫上线
Dalvik VM
1.由谷歌开发,但是只能称为虚拟机,而不能叫JVM,因为他虽然是使用java语言开发,但是不能直接执行Java的class文件。
2.基于寄存器架构,不是基于栈
3.执行的是编译以后的dex文件,执行效率比较高,适用于Android系统。
4.找一个apk文件,后缀改为zip,可以在电脑里直接解压,进去看到代码结构应该均为dex
2018.4 -> Graal VM
1.由Oracle Labs公开了Graal VM。号称 Run Programs Faster Anywhere
2.在HotSpot的基础上增强而成的跨语言全栈虚拟机,可以作为任意语言的运行平台使用,语言包括Java,Scala,Groovy,Kotlin,c,c++,JS,Ruby,Python,R
3.支持不同语言混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件
JVM上篇:JVM与Java体系结构的更多相关文章
- <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 【JVM之内存与垃圾回收篇】JVM与Java体系结构
JVM与Java体系结构 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM! 想解决线上JVM GC问题,但却无从下手. 新 ...
- JVM与Java体系结构
参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...
- JVM1 JVM与Java体系结构
目录 JVM与Java体系结构 虚拟机与Java虚拟机 虚拟机 Java虚拟机 JVM的位置 JVM的整体结构 Java代码执行流程 JVM的架构模型 基于栈的指令级架构 基于寄存器的指令级架构 两种 ...
- JVM解毒——JVM与Java体系结构
你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...
- JVM(三):深入分析Java字节码-上
JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
- Java -JVM:JVM百科
ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...
- [转帖]JVM总结--JVM体系结构
JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...
- 深入理解JVM虚拟机11:Java内存异常原理与实践
本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...
随机推荐
- Flink源码学习笔记(3)了解Flink HA功能的实现
使用Flink HA功能维护JobManager中组件的生命周期,可以有效的避免因为JobManager 进程失败导致任务无法恢复的情况. 接下来分享下 Flink HA功能的实现 大纲 基于Zook ...
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- 从服务之间的调用来看 我们为什么需要Dapr
Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...
- Vue2和Vue3技术整理3 - 高级篇
3.高级篇 前言 基础篇链接:https://www.cnblogs.com/xiegongzi/p/15782921.html 组件化开发篇链接:https://www.cnblogs.com/xi ...
- Ubuntu 18.04 修改默认源为国内源
1.备份/etc/apt/sources.list #备份 cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.在/etc/apt/sources ...
- NSURL组成部分详解
手思中有这么一段代码,初看下,让人摸不着头脑 //功能:UIWebView响应长按事件 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithR ...
- 一键部署lnmp
一键部署lnmp 提前将nginx .mysql .php 所需安装包都放在/opt目录下 脚本启动结束时,重启一下nginx 服务,就能在火狐浏览器更新出php测试页 脚本如下:(脚本里的软件 ...
- go基础——变量与常量
变量 package main import "fmt" /* 变量:variable 概念:一小块内存,用于存储数据,在程序运行过程中数值可以改变 特性:静态语言,强类型语言 * ...
- 基于myscript.js的web手写板(支持中文识别)
网上的手写板模板不少,但是支持中文识别的却不多,而且基本上都收费的,毕竟别人的中文库凭什么免费提供给你(说好的开源呢?说好的开源呢? ←_←) 好了,进入主题,myscript.js,在官网其实我并没 ...
- 2022年了有哪些值得推荐的.NET ORM框架?
前言: 最近有很多同学问我.NET方面有哪些好用的ORM框架,我觉得这方面的介绍网上应该会介绍的比较全面文章,于是我想搜一篇全面的介绍文章发给他们结果我发现网上说来说去基本上就是那几个,于是就有了这篇 ...