Java虚拟机(JVM):第一幕:起源,不一定全,但是一定靠谱
在学习JVM之前,先分享一则信息:2009 年4月20日,Orace 宣布正式以74 亿美元的价格收购市值曾超过2000 亿美元的Sun公司,传奇的Sun Microsystems 从此落幕成为历史。
一、Java虚拟机的介绍
首先登场的是,虚拟机的始组:Sun Classic / Exact VM,Sun Classic 被誉为世界上第一款商用Java虚拟机,只能使用纯解释器方式来执行,如果想要使用即时编译器则必须进行外挂,但是如果使用了外挂,那么解释器就不能工作了。
所以,这个时候的Java语言很慢的印象,就在用户心中树立起来了。
接下来,上场的是英雄气短的Exact VM,成名之作在于准确式内存管理,简单来说,就是虚拟机知道内存中某一个位置的数据具体是什么类型的。
随之而来的是,武林盟主:HotSpot VM,是目前使用范围最广的Java虚拟机。就是这么一款吊炸天的虚拟机,是由一家小公司开发的。于是,在1997年,Sun公司,收购了Longview Technologies公司,从而获得了HotSpot虚拟机。名称中的HotSpot指的是:热点代码探测能力。可以通过执行计数器来找出最具有编译价值的代码,之后通知即时编译器以方法为单位进行编译。
总的来说,只有编译器和解释器恰如其分的协同工作,可以在最优化的程序中,响应时间与最佳执行性能中取得平衡,而且无须等待本地代码的输出才能执行程序。
江湖之间,并不只有打打杀杀,还有小家碧玉的虚拟机Mobile / Embedded VM,在嵌入式设备上,ME VM不仅面临外部忧患,而且还面临这自家SE Embedded的竞争和侵蚀。当然了,既然有武林盟主,当然还有长老、大师之类的角色。天下第二的BEA JRockit / IBM J9 VM 在历史上也存在着一定的地位。BEA公司的JRockit 可是号称“世界上速度最快的Java虚拟机”,BEA 将自家的JRockit虚拟机着重发展成为专门为服务器硬件和服务端应用场景高度优化的虚拟机,JRockit 内部不包含解释器的实现,全部代码都靠着即时编译器编译后执行。JRockit 的垃圾收集器也是处于Java虚拟机的领先水平。但是,随着BEA 公司被Oracle公司收购,版本永远停留在了R28。
IBM J9虚拟机的定位,跟HotSpot差不多,在设计上全面考虑服务端、桌面应用,再到嵌入式的多用途虚拟机,J9的职责分离与模块化做的比HotSpot更加的优秀。
当然了,除了平常运行的商业虚拟机,还有一些软硬件相结合工作的专有虚拟机,往往能够实现更高的执行性能,比如Liquid VM,它直接越过通用的操作系统去直接控制硬件,不需要进行内核态/用户态的切换,可以最大限度地发挥硬件的能力。Azul VM虚拟机提供了巨大内存范围内停顿时间可以控制的垃圾收集器(PGC和C4收集器),但是这个虚拟机是Azul公司在HotSpot虚拟机的基础上,进行大量改进得来的。Azul公司发布了自己的Zing虚拟机,Zing虚拟机的好处实在是太多了,可以让普通用户无须了解垃圾收集等底层调优,享有低延迟、快速预热、易于监控的功能。这可是Zing虚拟机的核心价值与卖点。
有擂主就肯定有挑战者的存在,这里的挑战者是来自Apache的Harmony与Google 公司的Android Dalvik 虚拟机,但是这两个虚拟机不能被称为Java虚拟机。在虚拟机的海洋中,不仅仅只有商用虚拟机,还有一些设计之初就仅仅抱着研究、验证某种技术和观点。比如:KVM、Java Card VM、Squawk VM、JavaInJava、Maxine VM、Jikes RVM、IKVM.NET等等。
Java虚拟机(JVM):第一幕:起源,不一定全,但是一定靠谱的更多相关文章
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- Java虚拟机(JVM)知多少
本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...
- 深入理解java虚拟机JVM(下)
深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...
- java虚拟机jvm启动后java代码层面发生了什么?
java虚拟机jvm启动后java代码层面发生了什么? 0000 我想验证的事情 java代码在被编译后可以被jdk提供的java命令进行加载和运行, 在我们的程序被运行起来的时候,都发生了什么事情, ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Java虚拟机JVM学习05 类加载器的父委托机制
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...
- Java虚拟机JVM学习04 类的初始化
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
随机推荐
- XXE漏洞详解
XML外部实体注入--XXE漏洞详解 简单来说一下这个XXE漏洞,在这之前我也阅读了很多关于XXE漏洞的文章,发现有一小部分文章题目是 "XXE外部实体注入" 这样的字眼,我想这样 ...
- Java 集合框架体系简介
为什么要使用集合 存储多个数据可以使用数组,但由于数组在内存中是连续存储的,所以会有一些限制.比如数组在创建时就要指定长度,即可以容纳的元素个数,且指定后无法更改:数组在创建时需要指定元素的类型,并且 ...
- 1.6 编写双管道ShellCode后门
本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道.启动进程.传输数据等方面对这个功能进行详细讲解.此外,本文还将通过使用 ...
- 从数据库中读取数据并写入到Excle电子表格之2
//CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...
- 从数据库中读取数据并写入到Excle电子表格之1
//获取数据 using (SqlDataReader reader = Alian_SQL_Helper.SQL_Helper .ExecuteReader( "select CC_Aut ...
- kafka-eagle-2.0.5安装指南
kafka eagle 安装文档 环境介绍 :kafka 三台 版本:2.2.1+cdh6.3.2 管理:ZK kafka-eagle-bin-2.0.5.tar.gz安装包准备 官网 :http:/ ...
- Blazor 跨平台的、共享一套UI的天气预报 Demo
1. 前言 很久之前就读过 dotnet9 大佬的一篇文章,MAUI与Blazor共享一套UI,媲美Flutter,实现Windows.macOS.Android.iOS.Web通用UI,没读过的可以 ...
- 什么是PMP?
PMP(Project Management Professional)中文名称叫项目管理专业人士资格认证.它是由美国项目管理协会(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证 ...
- debian11安装配置记录
安装 软件包默认是桌面环境 + gnome + 标准安装.如果做服务器,建议标准安装 + ssh server 设置静态ip cd /etc/network/interfaces.d vi ifcfg ...
- 解决win10/ubuntu端口占用问题
win10解决方案 首先打开cmd命令行 命令行里输入 netstat -ano|findstr 被占用端口号 然后可以看到占用该端口号的pid 输入taskkill -f -pid pid号即可 u ...