你的位置:亚洲日韩欧美人成黄瓜_好嗨呦直播app下载_大胆西西人体gogo_美女下面直流白水视频_人妻中出无码一区二区_最新婬乱小说午夜视频_无码艳妇乳肉豪妇荡乳 > 女同学被下药强啪到爽 >


肚子里满满的全是精华locals=4

发布日期:2022-09-23 06:00    点击次数:161


兄弟情电影在线观看肚子里满满的全是精华

在口试的期间,在问到对于JVM联系的问题,会发现不少的口试者都是机械的在操心,稍一细问就如丘而止。属于死记硬背型的,谈论是看书里记个能够的主张或者图,并莫得连结含义。

执行上这块内容,看主张的期间能对照一个通俗的期间分析,不错更好的连结。底下我们运转。

市面上常见的JVM册本里,对于JVM的体绑缚构,一般离别红以下几个部分:

类加载器 期间计数器(Program Counter Register,简称PC Register) Java 杜撰机栈(Java Virtual Machine Stacks) 堆(Heap) 次第区(Method Area) 运行时常量池(Run-time Constant Pool) 土产货次第栈(Native Method Stack) 栈帧(Stack Frame) 履行引擎(Execution Engine)

其中2~7项,又称为运行时数据区,毕竟这些东西独一JVM 跑起来才会创建。这个分类,基本都是参照 Java 杜撰机程序。

若是干巴巴的记主张没啥意旨道理,吃个饭可能就忘了。接下来用 1+2这个期间来试着连结它。

我们来看个入门Java 编程的期间都基本都写过的,相似 Hello World的期间。

public class HelloWorld {     public static void main(String[] args) {         int a = 1;         int b = 2;         int c = a + b;     } } 

先 javac 编译之后,再用javap -verbose HelloWorld 来明察一下, 你会看到相似底下的输出内容:

public class HelloWorld   minor version: 0   major version: 55   flags: (0x0021) ACC_PUBLIC, ACC_SUPER   this_class: #2     // HelloWorld   super_class: #3    // java/lang/Object   interfaces: 0, fields: 0, methods: 2, attributes: 1 Constant pool:    #1 = Methodref          #3.#12         // java/lang/Object."<init>":()V    #2 = Class              #13            // HelloWorld    #3 = Class              #14            // java/lang/Object    #4 = Utf8               <init>    #5 = Utf8               ()V    #6 = Utf8               Code    #7 = Utf8               LineNumberTable    #8 = Utf8               main    #9 = Utf8               ([Ljava/lang/String;)V   #10 = Utf8               SourceFile   #11 = Utf8               HelloWorld.java   #12 = NameAndType        #4:#5          // "<init>":()V   #13 = Utf8               HelloWorld   #14 = Utf8               java/lang/Object {   public HelloWorld();     descriptor: ()V     flags: (0x0001) 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 1: 0    public static void main(java.lang.String[]);     descriptor: ([Ljava/lang/String;)V     flags: (0x0009) ACC_PUBLIC, ACC_STATIC     Code:       stack=2, locals=4, args_size=1          0: iconst_1          1: istore_1          2: iconst_2          3: istore_2          4: iload_1          5: iload_2          6: iadd          7: istore_3          8: return       LineNumberTable:         line 3: 0         line 4: 2         line 5: 4         line 6: 8 } 

好嘞。我们都清亮,上头这些便是Java的字节码。有了上头这个输出的内容,你把我方想像成杜撰机,来运行它,就连结了 Java 杜撰机里各个部分了。

当先,这部天职容,要履行, 伦埋一定得先读到内存里,负载读这些内容的,便是杜撰机的类加载器。

加载进来的其实是个二进制流,然后呢,需要把它整理成对应体式的内容才便捷使用嘛。比如这个类叫啥名字,经受了谁,都有什么次第,次第名字叫啥,内容是什么这些东西要找个地点放着。放哪好呢?次第区便是干这个的。

所谓的运行时常量池亦然次第区里的一块区域。往上看Constant Pool 在运行时会被剖析成 Run-time Constant Pool。若是触及到对其他类的援用等等,会在加载之后再连结的期间,把这内部的标记援用攻击成径直援用。

另外一些部分呢?综合来讲便是Java杜撰机栈,便是我们常说的栈,是用来履行次第里的具体内容的。这一部分其实不错这么连结。Java 杜撰机,和我们真确的物理机相似,都会把期间提供的提醒履行,只不外杜撰机是一个提供了一套有限提醒集的软件。物理机基本都是基于寄存器履行,一人?上面2人?下而 Java 杜撰机的对于提醒的履行终了是基于栈的。

既然是栈,那栈里要放点什么?没错,是栈帧,英文是 Frames,便是我们在使用 IDE debug 的期间看到的那一层一层的内容。

 

每个次第调用的期间,都会出现一帧,每一帧亦然个结构,次第履行用到的东西都在内部。比如在 Debug 的期间,一般都会看到每个变量和值, 这些变量称为土产货变量(local variables),在上头的输出内容里也有stack=2, locals=4, args_size=1 我们看到locals便是土产货变量,args_size是次第参数的长度,还有一个便是操作数(stack),数值是栈的最大深度。

每个class 的大肆一个次第里,都会有 frame ,它们都有我方的 local variables 土产货变量表, 我方的operand stack 操作数栈,以及到run-time constant pool 运行时常量池的援用。诚然,也不错有一些彭胀信息,举例debug info。

那具体上头通俗的一个 1+2 这个操作,对应到 jvm 提醒有这些:

0: iconst_1          1: istore_1          2: iconst_2          3: istore_2          4: iload_1          5: iload_2          6: iadd          7: istore_3          8: return 

具体现时履行到第几条提醒,需要有个标志,这个活儿让期间计数器给干了。这小子一直指向下一条行将履行的提醒。基本栈的终了,上头的提醒野蛮是把常量1赋值给第一个变量,常量2赋值给第二个变量,之后,变量一入栈,变量二入栈,履行iadd操作的期间,这两个数据出栈,完成乞降,再赋值给变量3,入栈,再复返。下次我们细说JVM提醒的期间,再详备说说。这些提醒的履行,诚然离不开履行引擎。

因为不需要履行Native次第,是以我们一般毋庸土产货次第栈,这是给相似JNI这些土产货次第终了准备的。

你看,明察了1+2的经由,基本Java 杜撰机的结构是不是就连结了?:-) 若是已经记不住的话,你不错这么想啊,Java 的寰宇里,无为会说到堆和栈。那栈用来存啥呢?想想你 debug 期间看到的那一层层的帧, 然后再想想今天的1+2的履行,应该就齐了。

本文转载自微信公众号「 Tomcat那些事儿」,不错通过以下二维码讲理。转载本文请联系 Tomcat那些事儿公众号。

 

 



    热点资讯

    相关资讯