当前位置:正文

终了相通的功能需要更多的辅导官网入口

发布日期:2024-05-29 15:40    点击次数:60

 官网入口[[322350]]官网入口

你是否也遭遇过这些问题?

运行线上系统一会儿卡死,系统无法探听,致使班师OOM 念念处置线上JVM GC问题,但却无从下手 新神气上线,对多样JVM参数设立一脸懵逼,班师默许,然后就JJ了 每次口试齐要重新背一遍JVM的一些旨趣见识性东西

这段告白语写的好,趁着在家办公学习下JVM,先列出举座常识点:

JVM解毒——JVM与Java体捆绑构

Java开发齐知谈JVM是Java诬捏机,上学时还用过的VM也叫诬捏机,先比拟一波。

诬捏机与Java诬捏机

所谓诬捏机(Virtual Machine),即是一台诬捏的野神思。它是一款软件,用来扩充一系列诬捏野神思辅导。大体上,诬捏机不错分为系统诬捏机和措施诬捏机。

Visaual Box,VMware就属于系统诬捏机,它们通盘是对物理野神思的仿真,提供了一个可运行完好操作系统的软件平台 措施诬捏机的典型代表即是Java诬捏机,它成心为扩充单个野神思措施而联想,在Java诬捏机中扩充的辅导咱们称为Java字节码辅导

JVM 是什么

JVM 是 Java Virtual Machine(Java诬捏机)的缩写,JVM是一种用于野心开荒的范例,它是一个虚构的野神思,是通过在本色的野神思上仿真模拟多样野神思功能来终了的。

Java诬捏机是二进制字节码的运行环境,负责装载字节码到其里面,证明/编译为对应平台的机器辅导扩充。每一条Java辅导,Java诬捏机范例中齐有扎眼界说,如奈何取操作数,奈何处理操作数,处理后果放在那里。

特质

一次编译,到处运次(跨平台) 自动内存不停 自动垃圾回收功能

字节码

咱们平时所说的java字节码官网入口,指的是用java话语编写的字节码,准确的说任何能在jvm平台上扩充的字节码状况齐是一样的,是以应该统称为jvm字节码。

不同的编译器不错编译出交流的字节码文献,字节码文献也不错在不同的jvm上运行。

Java诬捏机与Java话语莫得宠必的有关,它只与特定的二进制文献状况——Class文献状况相关,Class文献中包含了Java诬捏机辅导集(概况称为字节码、Bytecodes)和象征集,还有一些其他辅助信息。

Java代码扩充进程

JVM解毒——JVM与Java体捆绑构

JVM的位置

JVM是运行在操作系统之上的,它与硬件莫得班师的交互。

JDK(Java Development Kit) 是 Java 话语的软件开发用具包(SDK)。JDK 物理存在,是 Java Language、Tools、JRE 和 JVM 的一个齐集。

JVM解毒——JVM与Java体捆绑构 JVM解毒——JVM与Java体捆绑构

JVM举座结构

JVM解毒——JVM与Java体捆绑构

JVM的架构模子

Java编译器输入的辅导流基本上是一种基于栈的辅导集架构,另外一种辅导集架构则是基于寄存器的辅导集架构。

两种架构之间的区别:

基于栈式架构的特质联想和终了更粗浅,适用于资源受限的系统;躲避了寄存器的分派潦倒,使用零地址辅导形态分派;辅导流中的辅导大部分是零地址辅导,其扩充进程依赖于操作栈。辅导集更小,编译器容易终了;不需要硬件援手,可移植性更好,更好终了跨平台 基于寄存器架构的特质典型的欺骗是X86的二进制辅导集:比如传统的PC以及Android的Davlik诬捏机;辅导集架构则通盘依赖硬件,可移植性差;性能优秀和扩充更高效;浪费更少的辅导去完成一项操作;大部分情况下,基于寄存器架构的辅导集通常齐以一地址辅导、二地址辅导和三地址辅导为主,而基于栈式架构的辅导集却是以零地址辅导为主

由于跨平台性的联想官网入口,Java的辅导齐是把柄栈来联想的。不同平台CPU架构不同,是以不行联想为基于寄存器的,优点是跨平台,辅导集小,编译器容易终了,污点是性能下落,终了相通的功能需要更多的辅导。

分析基于栈式架构的JVM代码扩充进程

参加class文献地方目次,扩充javap -v xx.class反默契(概况通过IDEA插件Jclasslib班师检察),不错看到面前类对应的code区(汇编辅导)、土产货变量表、异常表和代码行偏移量映射表、常量池等信息。

 

JVM解毒——JVM与Java体捆绑构

以上图中的 1+2 为例证明:

Classfile /Users/starfish/workspace/myCode/starfish-learning/starfish-learn/target/classes/priv/starfish/jvm/JVM1.class   Last modified 2020-2-7; size 487 bytes   MD5 checksum 1a9653128b55585b2745270d13b17aaf   Compiled from "JVM1.java" public class priv.starfish.jvm.JVM1   SourceFile: "JVM1.java"   minor version: 0   major version: 52   flags: ACC_PUBLIC, ACC_SUPER Constant pool:    #1 = Methodref          #3.#22         //  java/lang/Object."<init>":()V    #2 = Class              #23            //  priv/starfish/jvm/JVM1    #3 = Class              #24            //  java/lang/Object    #4 = Utf8               <init>    #5 = Utf8               ()V    #6 = Utf8               Code    #7 = Utf8               LineNumberTable    #8 = Utf8               LocalVariableTable    #9 = Utf8               this   #10 = Utf8               Lpriv/starfish/jvm/JVM1;   #11 = Utf8               main   #12 = Utf8               ([Ljava/lang/String;)V   #13 = Utf8               args   #14 = Utf8               [Ljava/lang/String;   #15 = Utf8               i   #16 = Utf8               I   #17 = Utf8               j   #18 = Utf8               k   #19 = Utf8               MethodParameters   #20 = Utf8               SourceFile   #21 = Utf8               JVM1.java   #22 = NameAndType        #4:#5          //  "<init>":()V   #23 = Utf8               priv/starfish/jvm/JVM1   #24 = Utf8               java/lang/Object {   public priv.starfish.jvm.JVM1();     flags: ACC_PUBLIC     Code:       stack=1, locals=1, args_size=1          0: aload_0                 1: invokespecial #1                  // Method java/lang/Object."<init>":()V          4: return               LineNumberTable:         line 3: 0       LocalVariableTable:         Start  Length  Slot  Name   Signature                0       5     0  this   Lpriv/starfish/jvm/JVM1;    public static void main(java.lang.String[]);     flags: ACC_PUBLIC, ACC_STATIC     Code:       stack=2, locals=4, args_size=1          0: iconst_1      //冒号前的数字示意措施计数器的数,常量1入栈          1: istore_1      //保存到1的操作数栈中,这里的1示意操作数栈的索引位置          2: iconst_2                3: istore_2                4: iload_1       //加载          5: iload_2                 6: iadd          //常量出栈,乞降          7: istore_3      //存储到索引为3的操作数栈          8: return               LineNumberTable:         line 6: 0         line 7: 2         line 8: 4         line 9: 8       LocalVariableTable:         Start  Length  Slot  Name   Signature                0       9     0  args   [Ljava/lang/String;                2       7     1     i   I                4       5     2     j   I                8       1     3     k   I       MethodParameters: length = 0x5        01 00 0D 00 00  } 

JVM生命周期

诬捏机的启动

Java诬捏机的启动是通过诱惑类加载器(Bootstrap Class Loader)创建一个启动类(initial class)来完成的,这个类是由诬捏机的具体终了指定的。

诬捏机的扩充

一个运行中的Java诬捏机有着一个明晰的任务:扩充Java措施 措施脱手扩充时它才运行,措施落拓时它就罢手 扩充一个所谓的Java措施的时候,真确扩充的是一个叫作念Java诬捏机的进度 你在统一台机器上运行三个措施,就会有三个运行中的Java诬捏机。 Java诬捏机老是脱手于一个main()方法,这个方法必须是公有、复返void、只接受一个字符串数组。在措施扩充时,你必须给Java诬捏机指明这个包含main()方法的类名。

诬捏机的退出

有以下几种情况:

措施普通扩充落拓 措施在扩充进程中遭遇了异常或失实而异常圮绝 由于操作系统出现失实而导致Java诬捏机进度圮绝 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,何况Java安全不停器也允许此次exit或halt操作 除此以外,JNI(Java Native Interface)范例刻画了用JNI Invocation API来加载或卸载Java诬捏机时,Java诬捏机的退出情况

Java和JVM范例

Java Language and Virtual Machine Specifications

JVM发展历程

JDK 版块升级不单是体咫尺话语和功能本性上,还包括了其编译和扩充的 Java 诬捏机的升级。

1990年,在Sun野神思公司中,由Patrick Naughton、MikeSheridan及James Gosling指导的小组Green Team,开发出的新的措施话语,定名为Oak,后期定名为Java 1995年,Sun厚爱发布Java和HotJava家具,Java初度公开亮相 1996 年,JDK 1.0 发布时,提供了纯证明扩充的 Java 诬捏机终了:Sun Classic VM。 1997 年,JDK 1.1 发布时,诬捏机莫得作念变更,依然使用 Sun Classic VM 看成默许的诬捏机 1998 年,JDK 1.2 发布时,提供了运行在 Solaris 平台的 Exact VM 诬捏机,但此时如故用 Sun Classic VM 看成默许的 Java 诬捏机,同期发布了JSP/Servlet、EJB范例,以及将Java分红J2EE、J2SE、J2ME 2000 年,JDK1.3 发布,默许的 Java 诬捏机由 Sun Classic VM 改为 Sun HotSopt VM,而 Sun Classic VM 则看成备用诬捏机 2002 年,JDK 1.4 发布,Sun Classic VM 退出商用诬捏机舞台,班师使用 Sun HotSpot VM 看成默许诬捏机一直到咫尺 2003年,Java平台的Scala厚爱发布,同庚Groovy也加入了Java阵营 2004年,JDK1.5发布,同期JDK1.5更名为JDK5.0 2006年,JDK6发布,同庚,Java开源并培植了OpenJDK。问心无愧,Hotspot诬捏机也成为了OpenJDK默许诬捏机 2008年,Oracle收购BEA,得到了JRockit诬捏机 2010年,Oracle收购了Sun,取得Java商标和HotSpot诬捏机 2011年,JDK7发布,在JDK1.7u4中,厚爱启用了新的垃圾回收器G1 2014年,JDK8发布,用元空间MetaSpace取代了PermGen 2017年,JDK9发布,将G1设立为默许GC,替代CMS

Sun Classic VM

寰宇上第一款商用 Java 诬捏机。1996年跟着Java1.0的发布而发布,JDK1.4时通盘被淘汰; 这款诬捏机里面只提供证明器; 若是使用JIT编译器,就需要进行外挂。然而一朝使用了JIT编译器,JIT就会罗致诬捏机的扩充系统,证明器就不再使命,证明器和编译器不行勾通使命; 咫尺hotspot内置了此诬捏机

Exact VM

它的扩充系统仍是具备了当代高性能诬捏机的雏形:如热门探伤、两级即时编译器、编译器与默契器夹杂使命模式等; 使用准确式内存不停:诬捏机不错知谈内存中某个位置的数据具体是什么类型; 在买卖欺骗上只存在了很霎时的时期就被更优秀的 HotSpot VM 所取代

Sun HotSpot VM

它是 Sun JDK 和 OpenJDK 中所带的诬捏机,亦然咫尺使用畛域最广的 Java 诬捏机; 秉承了 Sun 之前两款商用诬捏机的优点(如准确式内存不停),也使用了许多我方新的期间上风,如热门代码探伤期间(通过扩充计数器找出最具有编译价值的代码,然后见知 JIT 编译器以方法为单元进行编译; Oracle 公司分裂收购了 BEA 和 Sun,并在 JDK8 的时候,整合了 JRokit VM 和 HotSpot VM,如使用了 JRokit 的垃圾回收器与 MissionControl 工作,使用了 HotSpot 的 JIT 编译器与夹杂的运行时系统。

BEA JRockit VM

专注于工作器端欺骗,里面不包含默契器终了; 堪称是寰宇上最快的JVM

IBM J9 VM

全称:IBM Technology for Java Virtual Machine,简称IT4J,里面代号:J9 商场定位于HotSpot接近,工作器端、桌面欺骗、镶嵌式等多用途VM 咫尺是有影响力的三大商用诬捏机之一

诬捏机有好多,此外还有Azul VM、Liquid VM、Apache Harmony、TaobaoJVM、Graal VM等

 





Powered by 🏆华体汇·体育全站app官网入口(中国)官方网站IOS安卓/通用版/手机版APP下载 @2013-2022 RSS地图 HTML地图