美文网首页
电脑中的迦太基军团(JAVA虚拟机JVM讲解)

电脑中的迦太基军团(JAVA虚拟机JVM讲解)

作者: 柠檬小猪 | 来源:发表于2021-12-23 15:16 被阅读0次

    JAVA和C的区别

    古罗马的死对头之一迦太基,最著名的就是雇佣兵。迦太基人并不擅长战斗,他们更喜欢经商,有钱了就可以把战斗的事交给雇佣兵。

    C和JAVA就像罗马和迦太基。

    C语言就像罗马:源码是当地民众,编译是训练招募,然后转变成士兵,到达目的地。

    JAVA语言就像迦太基:源码是当地民众,编译是集资交税,.class字节码是金币,JVM是当地向导和佣兵协议,获得士兵,到达目的地。

    JVM是一种用于计算设备的规范。

    JAVA的优势就在于跨平台,但是通过虚拟机转一道会比C慢。(C是直接编译后就可以在系统中运行)

    为什么要编译?编译前是人看的,编译后是机器看的,毕竟人不会写1010101。

    JDK会有多个平台的版本也是这个原因吗?

    顺便说一下JDK,JRE,JVM的关系

    JDK:开发环境

    JRE:运行环境

    JVM:开发语言和操作系统之间的桥梁

    JVM内存

    JVM内存中线程私有

    如果要作战,军团要分成若干大小不等的战团来作战,看将军的指挥能力。

    线程就是战团。

    战团里有什么呢?

    传令官(程序计数器)

    告诉大家战斗进行到哪一步了。

    程序计数器又叫PC寄存器,特点是小,做的事也少,但是很重要;线程私有,共享生命周期。

    通信小队(虚拟机栈)

    一个战团接到进攻敌方据点的命令,派骑兵绕后埋伏,骑兵派侦查兵去探路。进攻是第一个命令,但是他要等第二个命令埋伏部队就位了再执行,第二个命令要等第三个命令侦查兵反馈信息后再执行。他们之间靠通信小队来联系。

    栈:有点像弹夹,先进后出,入栈/压栈,出栈/弹栈。只说是弹夹的话又不好理解栈在JVM中的功能,所以这里比喻成通信小队。栈为什么要先进后出?A方法中调用了B方法,A方法要等B方法执行完了才能继续执行;这种时候栈就派上用场了。栈压入的不是方法,而是栈帧,栈帧对应方法。如果方法连续调用的太多,栈的内存不够,发生栈溢出;线程私有,共享生命周期。

    通信小队队员(栈帧):

    四个技能,1.携带执行任务用到的工具的背包;2.会写字记录结果(结果要放回背包);3.指令转白话;4.记住回去的路。

    栈帧的四部分:1.局域变量表,执行方法的参数和变量;2.操作数栈,将局域变量表中的数据拿出计算后再放回局域变量表;3.动态链接,符号引用转为直接引用;4.方法返回值,记录位置,方法执行完返回原位继续下一个方法。

    雇佣通信小队(本地方法栈):

    战团中除了迦太基的贵族亲卫部队,还有大量的雇佣军;调度他们的就是他们自己的通信小队。

    本地方法栈和虚拟机栈类似,调用的是本地native方法,填补JAVA缺陷。

    JVM内存中线程共享的

    后勤区(堆):

    营地里最大的一块地方,行军打仗后勤是最重要的;其中粮草军团中消耗最大东西,兵马未动粮草先行;后勤区的行李粮草供所有战团使用。

    堆:是JVM虚拟机中最大的一块区域,线程共享。

    食堂(GC堆):

    里面分人吃的和牲口吃的;人吃饭的地方收拾的比较勤快,有两个回收盘,每次收拾都会装进回收盘,然后回收盘的会去牲口区;牲口吃的都是人吃剩的,牲口吃饭的地方很长一段时间才会收拾;(更详细的说明小垃圾修真传(GC垃圾回收机制)

    GC:分年轻代和老年代;年轻代又分伊甸园和幸存区。

    集合点(方法区原方法区的字符串常量池和静态变量):

    方法区是一种规范,一个概念;并没有规定如何去实现它。类加载(.class文件加载)后类信息储存到方法区。

    士兵吃完饭拿好装备集合的地方;在后勤区,又不算后勤;

    方法区(老):是堆的一部分,别名叫“非堆”,逻辑是和堆分开的;用来储存已被虚拟机加载的类型信息,常量、 静态变量、 即时编译器编译后的代码缓存等数据。

    方法区(新):原方法区的定义是包括方法实现区的,JVM8后一分为二,实现区(运行时常量池,类型信息)在元空间;常量池和静态变量还在非堆中。静的还在JVM内存中,动的移到元空间

    战术暗号(常量池):每个暗号都对应不同的行动。

    常量池:是一个保存常量的表,运行时在方法区中;虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。

    JVM之外的本地内存

    本地内存就像战场,其中包括亲卫军战场和雇佣军战场;

    亲卫军战场(元空间):

    亲卫军有自己的战斗方式,所以不和雇佣军混在一起战斗。

    元空间:方法具体的落地实现区域。

    雇佣军战场(直接内存):

    有些地方利用本地雇佣兵效率会更高点,但是有一个要求,雇佣兵将领必须听的懂腓尼基语,由迦太基将领直接指挥。

    直接内存(Direct Memory):本地方法的落地实现区域;不是虚拟机运行时数据的一部分;原来是JAVA内存和本地内存通过复制数据来处理程序,现在相当于有一块共享的内存,大大提高效率。

    相关文章

      网友评论

          本文标题:电脑中的迦太基军团(JAVA虚拟机JVM讲解)

          本文链接:https://www.haomeiwen.com/subject/ytycqrtx.html