精华内容
下载资源
问答
  • JVM虚拟机发展历程

    2021-10-07 12:07:50
    是java1.0版本发布的第一款商用java虚拟机,其特点是只有解释器,如果需要编译器则需要外挂,但不能同时工作,现在hotspot内置了这个虚拟机。 exact vm 是为了解决上个虚拟机不能同时使用解释器和编译器的问题,它...

    sun class vm

    是java1.0版本发布的第一款商用java虚拟机,其特点是只有解释器,如果需要编译器则需要外挂,但不能同时工作,现在hotspot内置了这个虚拟机。

    exact vm

    是为了解决上个虚拟机不能同时使用解释器和编译器的问题,它可以知道内存中某个位置的数据是什么类型
    具备热点探测,能混合工作的雏形特点,但可惜英雄命短,在solaris 平台短暂使用后,hotspot就凭空出现替换了他。

    hotspot vm

    是由一家小公司设计的,后来被sun公司收购,jdk1.3的时候就成为了默认虚拟机
    绝对的市场占用率,oracle jdk和openjdk都默认使用,服务器端,桌面移动端嵌入式都可使用
    主要特点是:
    通过计数器找到最具编译的价值代码,触发及时编译或栈上替换
    通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。

    bea的JRockit

    是三个商用虚拟机之一,主要专注于服务器端,因为不太关注响应时间,所以不包含解释器实现,只靠及时编译器,是最快的jvm。
    主要特点是延迟敏感型,能提供 毫秒或微秒级别的响应时间,用于军事指挥,电信网络。
    还拥有missionControl服务套件,能以极低的开销来监控、管理、分析生产环境中应用程序的工具。
    后来 被oracle收购。

    ibm的J9

    定位于hotspot比较接近,可很多用途,广泛用于ibm的各种java产品,与自身产品结合得很好,是在自身产品中使用得最快的虚拟机。

    kvm和cdc/cldc hotspot

    是oracle在javame产品所使用的两个虚拟机,kvm是早期产品, 在更低端的设备上如老人机,智能控制器,传感器有自己的一席之地,而cdc是当年诺基亚塞班系统的游戏平台,如果ios和android二分天下后就没落了。

    azul vm

    azul systems公司在hotspot基础上改进,与自身的vega系统绑定,软硬件配合的专用虚拟机,高性能java虚拟机的战斗机。

    liquid vm

    bea公司开发的,也是高性能战斗机类似azul vm,特点是不需要操作系统的支持,本身已经实现了一个操作系统必要功能。目前已经停止了。

    apache harmony

    是由ibm和intel联合开发的开源jvm,但因为sun坚决不让它获得jcp认证,于是在2011年推移,ibm也转而参与了openjdk的开发,但它的java类库代码被先进了android sdk中了,也算是有所使用。

    microsoft jvm

    由微软为了能在ie3浏览器中支持java applets而开发的,特点是只能在window平台运行,但后面被sun指控后被微软移除了。

    taobaojvm

    由alijvm团队发布,基于openjdk开发的指定版本的alibabaJDK,是阿里java体系的基石,主要特点是创新的GCIH实现了off-heap,将生命周期较长的java对象从heap中移到了heap外,并且GC不能管理 GCIH内部的java对象,从而达到降低GC的回收频率和提升GC效率的目的。还有在GCIH内部的对象能实现在多个java虚拟机进程中共享。目前taobao VM已经在淘宝、天猫上线,替换了oracle官方的jvm。

    Dalvik VM

    由谷歌开发的用于andorid系统,在android2.2提供,特点是没有遵循java虚拟机规范,不能直接执行java的class文件而是dex文件执行效率比较高,架构上是基于寄存器架构,不是jvm的栈架构,在android5.0后支持提前编译。

    Grall VM

    由oracle开发的虚拟机,号称run programs faster anywhere ,是在hotspot vm基础上增强而成的跨语言全栈虚拟机,可以作为任何语言的平台使用,且支持各种语言的混用。其工作原理是将这些语言的源代码或源码编译后的中间格式通过解释器转换为最能被graal VM接受的中间表示,估计是oracle主推和未来会替代hotspot的虚拟机

    展开全文
  • 一、什么是Java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与...

    目录

    1、JVM虚拟机学习系列之一(Java虚拟机的发展史和java发展重大事件)

    2、JVM虚拟机学习系列之二(Java虚拟机的内部结构、整体框架、类加载子系统、双亲委派机制)

    3、JVM虚拟机学习系列之三(Java虚拟机的运行时数据区:程序计数器+虚拟机栈+本地方法栈)

    4、JVM虚拟机学习系列之四(Java虚拟机的字节码与类的加载)

    5、JVM虚拟机学习系列之五(Java虚拟机的字节码与类的加载)

    知识脑图学习:https://www.processon.com/view/60504b5ff346fb348a93b4fa#map


    一、为什么要学习Java虚拟机

    1. 首先是高新工作的面试需要(BAT、TMD、PKQ等面试都爱问)。
    2. 再是中高级程序员必备技能,也是项目管理、调优的需要。
    3. 最后是追求极客的精神,比如:垃圾回收算法、JIT、底层原理等。
    4. java虚拟机的垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,才是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。

    二、什么是Java虚拟机

    1. 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,其实是因为不同的操作系统的开发了相应的Java虚拟机才能使Java编写好的程序能在不同的机器上运行。
    2. Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言开发的程序的运行环境。
    3. Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一.条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

     三、常用的Java虚拟机

       1、Sun Classic VM

    • 早在1996年Java1.0版本的时候,Sun公司发布了一款名为Sun Classic vm的java虚拟机,它同时也是世界上第一款商业java虚拟机,jdk1.4时完全被淘汰
    • 这款虚拟机内部只提供解释器。
    • 如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
    • 现在Hotspot内置了此虚拟机;

       2、Exact VM

    • 为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。Exact Memory Management(准确式内存管理),也可以叫Non-Conservative/Accurate Memory Management;
    • 特点是虚拟机可以知道内存中某个位置的数据具体是什么类型;同时也具备现代高性能虚拟机的雏形,热点探测和编译器与解析器混合的工作模式。
    • Exact VM只在Solaris平台短暂使用,其他平台上还是classic vm。

       3、HotSpot VM   

    • HotSpot历史最初由一家名为“Longview Technologies”的小公司设计。
    • 1997年,此公司被Sun收购;2009年,Sun公司被甲骨文收购。
    • JDK1.3时,HotSpot VM成为java默认的虚拟机。
    • 特点:从他的名称中HotSpot指的就是它的热点代码探测技术。
    • 工作:通过计数器找到最具编译价值的代码,触发即时编译(JIT)或栈上替换;通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。
    • HotSpot VM不管是现在广泛使用JDK6,还是使用比较多的JDK8中,默认的虚拟机都是HotSpot;也是Sun/Oracle JDK和OpenJDK的默认虚拟机。
    • HotSpot VM从服务器、桌面到移动端、嵌入式都有应用。

       4、JRockit

    • MissionControl服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具,全面的Java运行时解决方案组合;2008,BEA被Oracle收购。
    • 使用JRockit产品,性能有显著的提高(一些超过了70%)和硬件成本的减少(达50%);
    • JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要;
    • Oracle表达了整合两大优秀虚拟机的工作,大致在JDK8中完成。整合的方式是在HotSpot的基础上,移植JRockit的优秀特性;
    • JRockit专注于服务器端应用,它可以不太关注程序的启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行;大量的行业基准测试显示,JRockit JVM是世界上最快的JVM。

       5、J9 JVM

    • 全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9
    • 市场定位于HotSpot接近,服务器端、桌面应用、嵌入式等多用途JVM;
    • 广泛用于IBM的各种Java产品;
    • 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的Java虚拟机(在IBM自己的产品上稳定);
    • 2017年左右,IBM发布了开源J9 VM,命名OpenJ9,交给Eclipse基金会管理,也称为Eclipse OpenJ9;

       6、Azul

    • 这里Azul VM和BEA Liquid VM是与特定硬件平台绑定、软硬件配合的专有虚拟机
    • 高性能Java虚拟机中的战斗机;
    • Azul VM是Azul Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机。
    • 每个Azul VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、专有硬件优化的线程调度等优秀特性。
    • 2010年,Azul Systems公司开始从硬件转向软件,发布了自己的Zing JVM,可以在通用X86平台上提供接近于Vega系统的特性;

       7、Liquid

    • Liquid是BEA公司开发的高性能Java虚拟机中的战斗机;
    • 运行在自家研发的Hypervisor系统上;
    • Liquid VM即是现在的JRockit VE(Virtual Edition),Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专有操作系统的必要功能,如线程调度、文件系统、网络支持等;
    • 随着JRockit虚拟机终止开发,Liquid VM项目也停止了;

       8、Apache Harmony

    • Apache也曾推出过于JDK1.5和JDK1.6兼容的Java运行平台Apache Harmony;
    • Apache Harmony是IBM和Intel联合开发的开源JVM,受到同样开源的OpenJDK的压制,SUN坚决不让Harmony获得JCP认证,最终于2011年退役,IBM转而参与OpenJDK;
    • 虽然目前并没有Apache Harmony被大规模商用的案例,但是它的Java类库代码吸纳进了Android SDK;

       9、Microsoft JVM

    • 微软为了在IE3浏览器中支持JAVA Applets,开发了Microsoft JVM;
    • 只能在Windows平台下运行。但却是当时windows下性能最好的Java JVM;
    • 1997年,Sun以侵犯商标、不正当竞争罪名指控微软成功,赔了Sun很多钱,微软在WindowsXP SP3中抹掉了其JVM。现在windows上安装的jdk都是HotSpot。

      10、Taobao JVM(国产研发)

    • 由Ali JVM 团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
    • 基于OpenJDK 开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里JAVA体系的基石;
    • 基于OpenJDK HotSpot JVM发布的国内第一个优化、深度定制且开源的高性能服务器版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和诊断协助功能
    • taobao JVM应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能;

      11、Dalvik JVM

    • Dalvik JVM是谷歌开发的,应用于Android系统,并在Android2.2中提供了JIT,发展迅猛;
    • Dalvik JVM只能称作虚拟机,而不能称作 “Java 虚拟机”,它没有遵循Java虚拟机规范;
    • 不能直接执行Java的Class文件;
    • 基于寄存器架构,不是JVM的栈架构;
    • 执行的是编译后的dex(Dalvik Executable)文件。执行效率比较高;
    • 它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等;
    • Android 5.0使用支持提前编译(Ahead of Time Compilation,AOT)的ART VM替换Dalvik VM。

      12、Graal VM

    • 2018年4月 Oracle Labs公开了Graal VM,号称“Run Programs Faster Anywhere”。与1995年java的“write once, run anywhere”遥相呼应;
    • Graal vm在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。语言包括:java、Scala、Groovy、Kotlin、C、C++、JavaScript、Ruby、Python、R等;
    • 支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件;
    • 工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建而向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率;
    • 如果说HotSpot有一天真的被取代,Graal VM希望最大。但是Java的软件生态没有丝毫变化;

     四、这么多的虚拟机,我们应该怎么学习呢

    1. 当然我们的学习与我们息息相关的HotSpot VM,现在我们大多公司开发中,使用的的java虚拟机都是HotSpot VM,当然你也可以使用Java -version命令查看一下你安装的java版本和java虚拟机。
    2. 打开cmd,输入命令:java -version

     五、Java虚拟机的特点

    1. 跨平台的语言
    2. 一次编译,到处运行
    3. 自动内存管理
    4. 自动垃圾回收功能
    5. 多语言混合编程:Java平台_上的多语言混合编程正成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。试想一下,在一个项目之中,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API- -样方便,因为它们最终都运行在-一个虚拟机之上。
    6. 随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。
    7. Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虛拟机的内部指令集、符号表以及其他的辅助信息,它就是-一个有效的字节码文件,就能够被虚拟机所识别并装载运行。

     六、补充一下Java发生的重大事件

    1. 1990年,在Sun计算机公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的小组Green Team,开发出的新的程序语言,命名为0ak, 后期命名为Java。
    2. 1995年, Sun 正式发布Java和HotJava产品,Java 首次公开亮相。
    3. 1996年1月23 日Sun Microsystems发布了JDK 1.0。
    4. 1998年,JDK 1.2版本发布。同时,Sun发布了JSP/Servlet、EJB规范,以及将Java分成了J2EE、 J2SE和J2ME。这表明 了Java开始向 企业、桌面应用和移动设备应用3大领域挺进。
    5. 2000年, JDK 1.3发布,Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。
    6. 2002年, JDK 1.4发布,古老的Classic虛拟机退出历史舞台。
    7. 2003年年底,Java平台的Scala正式发布,同年Groovy也加入了Javal阵营 。
    8. 2004年, JDK 1.5发布。同时JDK 1.5改名为JavaSE 5.0。
    9. 2006年,JDK 6发布。同年,Java开源并建立了OpenJDK。 顺理成章,Hotspot虚拟机也成为了OpenJDK中 的默认虛拟机。
    10. 2007年, Java平台迎来了新伙伴Clojure.
    11. 2008 年,Oracle收购了BEA, 得到了JRockit 虚拟机。.
    12. 2009年, Twitter宜 布把后台大部分程序从Ruby迁移到Scala,这是Java平台的又一次大规模应用。
    13. 2010年, Oracle收购了Sun,获得Java商标和最具价值的Hotspot虚拟机。此时,Oracle拥有市场占用率最高的两款虛拟机HotSpot和JRockit,并计划在未来对它们进行整合: HotRockit
    14. 2011年,JDK7发布。在JDK 1.7u4中,正式启用了新的垃圾回收器G1。
    15. 2017年, JDK9发布。将G1设置为默认GC,替代CMS,同年,IBM的J9开源, 形成了现在的0pen J9社区
    16. 2018年, Android的Java侵权案判决,Google赔 偿Oracle计88亿美元;同年,Oracle宣告JavaEE成为历史名词,JDBC、JMS、 Servlet赠予Eclipse基金会;同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK授权许可
    17. 2019年,JDK12发布,加入RedHat领导开发的Shenandoah GC

    后续学习请关注博主,持续更新分享java虚拟机的优化与原理应用,下次见。

    更多学习请到:https://mp.csdn.net/console/editor/html/112061984

    知识脑图学习:https://www.processon.com/view/60504b5ff346fb348a93b4fa#map

    展开全文
  • 虚拟机的历史版本和JVM数据区域详解 一、虚拟机的历史 Sun Classic: Sun Classic VM的技术可能很原始,这款虚拟机的使命也早已终结,但仅凭它“世界上第一款商用Java虚拟机”的头衔,就足够有让历史记住它的...

    虚拟机的历史版本和JVM数据区域详解

    一、虚拟机的历史

    1. Sun Classic:

    Sun Classic VM的技术可能很原始,这款虚拟机的使命也早已终结,但仅凭它“世界上第一款商用Java虚拟机”的头衔,就足够有让历史记住它的理由,Sun公司发布JDK 1.0中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用JIT编译器,就必须进行外挂。正是因为编译器和解释器不配合工作,就导致“Java语言很慢”这样的形象在用户心中建立,为了解决这样的问题,在发布JDK1.2时就发布过一款名为Exact VM的虚拟机。

       2.Exact VM:

    Exact VM它的执行系统已经具备现代高性能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。Exact VM因它使用准确式内存管理(Exact Memory Management,也可以叫Non-Conservative/Accurate Memory Management)而得名即虚拟机可以知道内存中某个位置的数据具体是什么类型。譬如内存中有一个32位的整数123456,它到底是一个reference类型指向123456的内存地址还是一个数值为123456的整数,虚拟机将有能力分辨出来,这样才能在GC(垃圾收集)的时候准确判断堆上的数据是否还可能被使用。

      3.HotSpot VM:

    Sun JDK和OpenJDK中所带的虚 拟机,也是目前使用范围最广的Java虚拟机。但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的。HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC,而Exact VM之中也有与HotSpot几乎一样的热点探测。HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。HotSpot虚拟机主要用于服务器、桌面领域的商用虚拟机。

     4.Sun Mobile-Embedded VM / Meta-Circular VM:

    Sun公司面对移动和嵌入式市场,发布过的虚拟机产品。

    5.JRockit VM:

    JRockit VM曾经号称“世界上速度最快的Java虚拟机”,BEA公司将其发展为一款专门为服务器硬件和服务器端应用场景高度优化的虚拟机,由于专注于服务器端应用,它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行。除此之外,JRockit的垃圾收集器和MissionControl服务套件等部分的实现,在众多Java虚拟机中也一直处于领先水平。

    6.IBM J9:

    与BEA JRockit专注于服务器端应用不同,IBM J9的市场定位与Sun HotSpot比较接近,它是一款设计上从服务器端到桌面应用再到嵌入式都全面考虑的多用途虚拟机,J9的开发目的是作为IBM公司各种Java产品的执行平台,它的主要市场是和IBM产品(如IBM WebSphere等)搭配以及在IBM AIX和z/OS这些平台上部署Java应用。因为在电信领域IBM的服务器占据了很大份额,所以才会在华为中IBM J9中有较大份额。

    7.BEA Liquid VM:

    我们平时所提及的“高性能Java虚拟机”一般是指HotSpot、JRockit、J9这类在通用平台上运行的商用虚拟机,但其实Azul VM和BEA Liquid VM这类特定硬件平台专有的虚拟机才是“高性能”的武器。Liquid VM即是现在的JRockit VE(Virtual Edition),它是BEA公司开发的,可以直接运行在自家Hypervisor系统上的JRockit VM的虚拟化版本,Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如文件系统、网络支持等。由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,如在线程调度时,不需要再进行内核态/用户态的切换等,这样可以最大限度地发挥硬件的能力,提升Java程序的执行性能。

    8.Dalvik VM:

    Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。但是它与Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。目前Dalvik VM随着Android一起处于迅猛发展阶段,在Android 2.2中已提供即时编译器实现,在执行性能上有了很大的提高。

    9.Apache Harmony:

    Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK 1.5和JDK 1.6的Java程序运行平台,这个介绍相当拗口。它包含自己的虚拟机和Java库,用户可以在上面运行Eclipse、Tomcat、Maven等常见的Java程序,但是它没有通过TCK认证,所以我们不得不用那么一长串拗口的语言来介绍它,而不能用一句“Apache的JDK”来说明。如果一个公司要宣布自己的运行平台“兼容于Java语言”,那就必须要通过TCK(Technology Compatibility Kit)的兼容性测试。因为Apache和SUN公司的矛盾,Apache就自己发展了,后来随着SUN公司将JDK开源形成openjdk后,Apache Harmony就没落了。

    10.Microsoft JVM:

    由于微软和SUN公司的官司,这个JVM就流产了。

    • 未来的虚拟机技术

    1. 模块化:

    随着应用系统的庞大和复杂,站在软件工业化的角度来看,模块化是一个必然趋势,

    JDK9的里面的特性就是模块化,在我们JAVA应用层面来讲,没有模块化的时候,应用上我们就提出了微服务。

        2. 混合语言:

    虚拟机是独立于语言,不只是只有JAVA语言才能运行在虚拟机上。

       3. 多核并行:

    CPU一开始成高频转变成多核,多核时代,我们需要关注并发编程,JDK5中引入了比较粗的并发编程,JDK7中引入并行计算框架Fork/join,JDK8中引入lambada,函数编程天生就是适合并发编程的技术。

       4. 丰富语法:

    JDK5中提出自动装箱、枚举、泛型、动态注解、遍历循环。JDK7里面Switch中可用String、支持二进制数字、try resource语句帮我们进行关闭,这都是JAVA在语法上的丰富。

       5、64位:

    64位机器正在逐步取代32位机器,JAVA的支持也都在向64位靠拢。

       6、更强的垃圾回收:

    目前放出来的JDK11里面的ZGC,号称是支持TB级内存容量,暂停时间低(<10ms)。

    • 运行时数据区域

    1. 程序计数器:

    较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响;

        2. 虚拟机栈:

    线程私有,生命周期和线程同生共死,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程;栈里面存放着各种基本数据类型和对象的引用(-Xss) ;-Xss参数是用来调整JAVA虚拟机栈的。一个线程调用多个方法,只会有一个栈。栈的缺省大小为1M

      

        3. 本地方法栈:

    本地方法栈保存的是native方法的信息,当一个JVM创建的线程调用native方法后,JVM不再为其在虚拟机栈中创建栈帧,JVM只是简单地动态链接并直接调用native方法;我们可以查看源码,找到Object类,找到wait方法就会看到有native修饰。一个线程也只有一个本地方法栈。

      4. JAVA堆:

    与我们操作最为紧密的区域,在代码中用new对象的时候,操作的就是该区域。几乎是所有的对象都在堆上分配,与堆相关的命令是:(-Xms;-Xmx;-Xmn;-XX:NewSize;-XX:MaxNewSize)

    -Xms;堆的最小值

    -Xmx;堆的最大值

    -Xmn;新生代的大小

    -XX:NewSize;新生代的最小值

    -XX:MaxNewSize;新生代的最大值

      5. 方法区(运行时常量池):

    也叫永久区(永久代),用于存储已经被虚拟机加载的类信息,常量("zdy","123"等),静态变量(static变量)等数据(-XX:PermSize;- XX:MaxPermSize;-XX:MetaspaceSize; - XX:MaxMetaspaceSize ),在JDK7及之前用的是-XX:PermSize;-XX:MaxPermSize;在JDK8及之后用的是(元数据空间)-XX:MetaspaceSize;-XX:MaxMetaspaceSize

      6. 运行时常量池:

    严格来说是方法区的一部分,JDK8及之后运行时常量池放到了堆里面。

     

    JDK8之后提出了元数据空间的概念,这个方法区就消失了,方法区从运行时数据区挪到了虚拟机本身管理之外,只受制于物理内存的大小,不再受制于虚拟机的管理内存大小。同时运行时常量池也挪到了方法区。元空间不是直接内存,直接内存主要用于IO通信。

     

    永久代为什么说在JDK8之后要把它挪出来?在之前写代码中,用的默认的大小是64M,很容易碰到永久代溢出的问题。对永久代的调优也是比较困难的

     

    直接内存:不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域;MaxDirectMemorySize命令:限制直接内存大小。

    四、站在线程的角度

    1、 线程共享的区域:JAVA堆和方法区。

    2、 线程私有内存区:虚拟机栈、本地方法栈、程序计数器。

    3、 一个线程同一时间只能运行一个方法,所以肯定只有一个栈。

    4、 程序计数器也是同理,同一时间只能运行一行代码。

    5、 栈和程序计数器和线程同生共死,堆和方法区和java程序Java进程同生共死,也就决定了可以多个线程共享。

    五、方法的出入栈

    方法会打包成栈帧,一个栈帧至少包含局部变量表、操作数栈和帧数据区。方法的执行过程就是出栈入栈的过程。

     

    六、栈上分配

    什么叫栈上分配?对于线程所私有的对象,可以将其打散,在栈上进行分配,而不在堆上分配。

    那么栈上分配有什么好处?

    1、跟着函数调用自行销毁。

    2、不需要垃圾回收器的回收,可以提高性能。

    栈上分配的基础需要逃逸分析,逃逸分析的作用是判断我们分配的对象有没有可能逃出这个方法体如果我们最后return这个对象,那即使你把对象定义在了函数体内,但是这个对象还是会逃出这个方法体这个对象就逃出了你的方法作用域,有可能被其他方法线程调用,就不能进行栈上分配,因为对象逃跑了

    代码示例:

    public class StackAllocation {
        class User {
            private Integer id;
            private String name;
        }
    
        private void test() {
            User user = new User();
            user.id = 1;
            user.name = "name:" + 1;
        }
    
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            StackAllocation stackAllocation = new StackAllocation();
            for (int i = 0; i < 100000000; i++) {
                stackAllocation.test();
            }
            long end = System.currentTimeMillis();
            System.out.println("时间总计;" + (end - start) + "ms");
        }
    }

    测试逃逸分析的命令:

      -server -Xmx:10m -Xms:10m -XX:+DoEscapeAnalysis -XX:+PringGC -XX:+EliminateAllocations -XX:-UseTLAB

    -server  表示JVM的运行模式,有桌面模式和服务器模式,windows下会由桌面模式,Linux下一般是由服务器模式用的最多的一般是mix/client模式,mix混合模式会根据你的操作系统来判断用什么模式但这里强制使用server模式是因为只有在server模式下才能进行逃逸分析。

     -Xmx:10m 堆最大内存。

    -Xms:10m 堆最小内存。

    -XX:+DoEscapeAnalysis 是否开启逃逸分析。

    -XX:+PringGC 打印GC日志。

    -XX:+EliminateAllocations  标量替换,是不是容许将对象打散分配在栈上                 

    -XX:-UseTLAB              

    TLAB:ThreadLocalAllocBuffer  线程本地分配缓存为什么有这个东西?创建对象需要在堆上分配,堆上有一块一块区域,线程A、B申请各自的区域,如果有大量的线程来堆上申请内存,为了保证线程不会申请同一块内存,我们要进行加锁的操作,为了保证数据的独立TLAB会事先在堆中为每个线程分配一块私有内存,A线程用A的内存,B线程用B的内存,排排坐之后可以大大提高性能,TLAB是指每个线程在new对象的时候进行私有分配。但这个对象对所有的线程是可见和共享的。例如:内存是一个村子,每个人自己有自己的地皮,不能到别人地皮上建房子,但是房子别人都可以看见,都可以来玩,来住。-XX:-UseTLAB  我们是指关闭私有分配。

    +和-的意义就是:+代表开启这个参数,-代表关闭这个参数。

       

       

     

     

    展开全文
  •   2018-12-28 00:15:59 ...随着2018年即将结束,斗胆的预测一下, Kubernetes的未来虚拟机,而不是容器。 Kubernetes的未来虚拟机,而不是容器 2018年按照中国的十二生肖叫做狗年,技...

    https://www.toutiao.com/a6639707449186058755/

     

    2018-12-28 00:15:59

    Kubernetes作为一项技术对我今年的职业生涯非常重要,明年也会如此。随着2018年即将结束,斗胆的预测一下, Kubernetes的未来是虚拟机,而不是容器。

    Kubernetes的未来是虚拟机,而不是容器

    2018年按照中国的十二生肖叫做狗年,技术上是Kubernetes的一年。现在有很多人都在学习Kubernetes,各地的CIO们都在努力制定“Kubernetes战略”,一些组织已经在把一些线上服务跑在Kubernetes的环境下。

    换句话说,就像Gartner Hype Cycle说描述。任何一项新技术都是启动、高峰、低谷阶段,Kubernetes也延着这种趋势在发展。

    Kubernetes的未来是虚拟机?

     

    我是容器的忠实粉丝,我不会试图暗示容器已经死了。 Docker在2013以linux容器的概念闯入我们工作中, 他们向我们展示了一种构建,打包,共享和部署应用程序的令人惊喜的新方法,而这个时期正是我们认真考虑如何持续交付的时候。 他们的模型非常适合现代交付管道以及PaaS和后来的CaaS平台的出现。

    Kubernetes的未来是虚拟机?

     

    在Google工作的工程师看到技术社区终于为容器做好了准备。 Google已经在很长一段时间内使用(或多或少发明)容器,他们开始构建Kubernetes,它构建在前身Borg平台基础上,同时为社区贡献力量。

    没过多久,大的公有云厂商就提供了基于Kubernetes的平台(GKE,AKS,EKS),私有云也很快建立了基于Kubernetes的平台(Pivotal Container Service,Openshift等)。

    柔性多租户

    有一个棘手的问题需要解决:多租户,这个能否解决的好,将决定容器的未来。

    Linux容器并非构建为安全的隔离沙箱(如Solaris Zones或FreeBSD Jails)。相反,它们建立在共享内核模型的基础上,该模型利用内核功能提供基本的进程隔离。正如Jessie Frazelle所说:“容器不是一切”。

    更复杂的是,大多数Kubernetes组件也绝非都是安全隔离的。 当然你有命名空间和Pod安全策略,但API本身不具备。 内部组件像kubelet或kube-proxy也不具备, 这导致Kubernetes只能适合“软租赁”模型。

    Kubernetes的未来是虚拟机?

     

    劣势,建立在容器之上的平台将继承容器的许多软多租户特效,而在硬件多租户虚拟机之上构建的平台都继承了硬性多租户特性(VMWare,Amazon Web Services,Openstack等)。

    Kubernetes集群本身就是“硬性多租户”,这导致了“许多集群”而不是“一个大共享”集群的新兴模式。看到Google GKE服务的客户为多个团队部署了数十个Kubernetes集群并不罕见。通常每个开发人员都有自己的集群,这种行为会导致令人震惊的Kubesprawl数量。

    “这种行为会导致令人震惊的Kubesprawl”

    通常,您获得的最小集群是4台计算机(或VM)。 Kubernetes Master的一个(或3个HA),Kubernetes Worker的三个。这中系统性价比很低,大部分系统资源被闲置浪费。

    所以我们需要以某种方式将Kubernetes转移到硬性多租户模型。 Kubernetes社区非常了解这一需求,并拥有一个多租户工作组。这个小组一直在努力解决这个问题,他们有几个建议的模型和建议如何解决每个模型。

    只需制作针对速度优化的小型虚拟机......

    Kata Containers是一个开源项目和社区,致力于构建轻量级虚拟机(VM)的标准实现,感知和执行类似容器,但提供VM的工作负载隔离和安全优势。

    Jessie建议使用VM容器技术,例如Kata Containers。 Kata Containers结合了虚拟机级别隔离,可以像容器一样执行。这允许Kubernetes在嵌套的VM容器(在底层IaaS提供的VM内运行的VM容器)中运行的每个租户(我们假定每个命名空间的租户)提供自己的一组Kubernetes系统服务。

    Kubernetes的未来是虚拟机?

     

    这是Kubernetes多租户的优雅解决方案。 她的建议甚至进一步表明Kubernetes使用嵌套的容器虚拟机来运行Kubernetes上的工作负载(Pod),从而大大提高了资源利用率。

    我们在这里至少还有一个优化。 为底层IaaS或云提供商构建合适的管理平台。 如果VM容器是IaaS提供的第一级抽象,那么我们甚至可以进一步提高资源利用率。 运行Kubernetes集群所需的最小VM数量下降到一个(或三个HA)以承载暴露给“超级用户”的Kubernetes控制平面。

    资源(成本)优化多租户

    具有两个名称空间的Kubernetes部署都运行了许多应用程序,看起来像这样。

    Kubernetes的未来是虚拟机?

     

    最初,部署到云的基础设施为零,因此超级用户的成本为零。

    超级用户从云端请求Kubernetes集群。云提供商为运行主Kubernetes API和系统服务创建单个Container VM(或3个用于HA)。超级用户可以选择在系统命名空间中部署pod,或者创建新的命名空间以委派对其他用户的访问权限。

    超级用户创建两个命名空间foo和bar。 Kubernetes为每个命名空间的控制平面(Kubernetes API和系统服务)从云中请求两个VM容器。超级用户将访问这些命名空间的用户委派给每个部署一些pod的用户,他们各自的控制平面为每个pod载请求VM容器。

    在此的所有阶段,超级用户仅支付实际消耗的资源。云提供商拥有云的任何用户可用的容量。

    我实际上并没有在这里说任何新的东西......

    云提供商已经在努力实现这一未来。您可以通过观察开源社区中发生的事情来看到这种情况。 (可以说亚马逊已经与Fargate已经私下再做了这件事)。

    第一个提示是Virtual Kubelet,它是一个开源工具,旨在伪装成一个kubelet。它将Kubernetes连接到其他API。这将允许Kubernetes从Cloud的Container VM调度程序请求Container VM。

    其他提示包括新兴VM容器技术的数量,已经提到的Kata容器,还有来自亚马逊的Firecracker和来自Google的gvisor。

    结论

    与Kubernetes硬性多租户模式相结合,您将获得Kubernetes的成功密钥。完全隔离Kubernetes工作负载和纯每个Pod消耗成本模型,以在Kubernetes上运行工作负载。

    对于那些不在公共云上的人,我们没有获得与基础设施提供商(在这种情况下是您自己)的容量负担相同的消费模型。您仍然可以获得更高资源利用率的好处,这可以降低容量需求。

    让我们希望VMWare和Openstack正在关注并为我们带来基于轻量级VM容器技术的虚拟机管理程序和适当的Virtual Kubelet实现。

    展开全文
  • 二、Java虚拟机(部分) 2.1 Sun Classic VM 2.2 Sun Exact VM 2.3 Sun HotSpot VM 2.4 BEA JRockit VM 2.5 BEA Liquid VM 2.6IBM J9 VM 2.7 Azul VM 2.8 Microsoft JVM 三、总结 一、Java发展史 1991年4月...
  • JAVA 虚拟机深入研究(二)——JVM虚拟机发展以及一些Java的新东西 这是第二篇,我们来说说有关虚拟机发展。 一说到虚拟机,很多人潜意识就把它跟Sun的HotSpot虚拟机划上等号,也许有些人还会想到BEA 的JRockit...
  • 深入理解Java虚拟机:Java发展

    千次阅读 2016-12-19 21:29:15
    Java发展史 由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的詹姆斯·高斯林(James Gosling)...
  • Java虚拟机

    2018-01-20 13:22:29
    1.4 Java虚拟机发展史 1.4.1 Sun Classic Exact VM 1.4.2 Sun HotSpot VM 1.4.3 Sun Mobile-Embedded VM Meta-Circular VM 1.4.4 BEA JRockit IBM J9 VM 1.4.5 Azul VM BEA Liquid VM 1.4.6 Apache Harmony ...
  • 深入理解Java虚拟机-走近Java

    万次阅读 多人点赞 2020-01-02 15:02:08
    文章目录概述Java技术体系Java发展史Java虚拟机发展史展望Java技术的未来实战:自己编译JDK本章小结 本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机...
  • 云原生被喻为未来架构,在CNCF (云原生计算基金会)的推动下,以Kubernetes 为代表容器工具得到了迅速的发展,很多人都相信容器才是云计算的未来。那曾经奠基云计算平台的虚拟化技术是否就真的会成为过去时?  ...
  • 1.3 Java发展史 1.4 展望Java技术的未来 1.4.1 模块化 1.4.2 混合语言 1.4.3 多核并行 1.4.4 进一步丰富语法 1.4.5 64位虚拟机 说明:文章所有内容均摘自《深入理解Java虚拟机:JVM高级特性与最佳实践...
  • Java虚拟机之Java的发展历史
  • 第一章主要介绍了java技术体系的过去、现在和未来的一些发展趋势,并介绍了如何独立地编译OpenJDK 7. 1.2 Java 技术体系 Sun官方所定义的java技术体系包括以下几个组成部分:  Java程序设计语言  各种硬件平台...
  • java 虚拟机

    2021-10-14 16:31:27
    问:java 默认的虚拟机是什么 是我们的HotSpot虚拟机。 jdk分为两种 一种是OpenJDK 另一种是OracleJDK 在JDK11之前,Oracle JDK中还会存在一些Open JDK中没有的,闭源的功能。但在JDK11中,我们可以认为...
  • 在过去的几年里,我研究了多种虚拟机之后,领悟了应该或不应该做哪些事才能使代码被正确地优化。这些思想可以应用到编程语言上,语言深层的结构上以及优化这些语言的虚拟机上。从我炯炯的双眼望去,发现在当今的优化...
  • JAVA虚拟机发展

    2021-08-18 09:45:29
    一、java发展史 1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第 一次提出了“Write Once,Run Anywhere”的口号。 1996年1月23日,JDK 1.0发布,Java语言有了第一个...
  • 虚拟机安装

    千次阅读 2012-06-06 00:39:31
    安装VMware虚拟机 总述  VMware最著名的产品为ESX,安装在裸服务器上的强大server,最近系列产品升级,更名为vSphere系列,最新产品为vSphere 5.0。是VMware的企业级产品,该产品一直遥遥领先于微软Hyper-V跟思杰...
  • 前言: 先上章节导图,这本书还需要在读一遍 概述 技术体系: 发展未来: 这个未来是过去的未来,可能就是现在了,当然不全是
  • Dalvik虚拟机

    2014-06-10 11:45:33
    Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和...
  • Java 虚拟机的历史

    2020-05-08 16:18:37
    说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待。...今天我们就来简单回顾下 Java 虚拟机发展历史。 虚拟机始祖:Sun Classic 在 1996 年 1 月 23 日,Sun 发布 JDK 1.0,其中自带的虚...
  • 可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier LVMID) 2.jstat:虚拟机统计信息监视工具 ...
  • Android Dalvik虚拟机概述

    千次阅读 2014-09-11 11:59:26
    Dalvik虚拟机概述
  • java虚拟机简介

    2021-02-10 15:00:49
    java虚拟机学习 1.java及jvm简介 我们知道Java源代码,即.java文件,通过javac编译为.class文件。.class文件可以运行在JVM上,JVM底层会通过字节码解释器或者即时编译器(JIT Compiler)执行.class文件中的字节码指令...
  • 但是考虑到HotSpot未来发展,在JDK 6的时候HotSpot开发团队就有放弃永久代,逐步改为采用本地内存(Native Memory)来实现方法区的计划了[插图],到了JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态...
  • 一、介绍JVM跨语言的平台随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序ava虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只...
  • jvm深入理解为什么要了解虚拟机虚拟机历史未来的 Java 技术模块化多核并行丰富语法64 位更强的垃圾回收器(现在主流 CMS、G1)JavaSE 体系架构JDKJREJVM运行时数据区域 为什么要了解虚拟机 JVM 不单单只支持 Java ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,288
精华内容 13,315
关键字:

虚拟机的未来发展