JVM學習筆記6:常量的本質含義與反編譯及註記符詳解

一、虛擬機參數:

1、 -XX:+TraceClassLoding 用於追蹤類的加載信息並打印出來 同理還有一個unLoading

保存、運行可以看到如下的信息

[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar]  第二行就是我們常見的Object父類

會發先父類和子類都加載了,只是子類沒有初始化,還是學習5的代碼運行結果。

2、-XX: (所有的都是這個開頭的) +<option> 開啓option 選項

                                                     -<option> 關閉option 選項

                                                     <option>=value 將option選項的值設置爲value

第一個例子完,開始第二個例子

二、註記符,常量的初始化

1、常量的初始化:

在編譯階段這個常量存入調用這個常量的那個方法所在的類的常量池當中,本質上,調用類並沒有直接引用到定義常量的類,因此並不會出發定義常量類的初始化。
注意:這裏指的是將常量存放到Mytest2的常量池中,之後與MyParent2就沒有關係了,甚至,我們可以將MyParent2的class文件刪除
package com.shengsiyuan.jvm.classloder;
//在編譯階段這個常量存入調用這個常量的那個方法所在的類的常量池當中
//本質上,調用類並沒有直接引用到定義常量的類,因此並不會出發定義常量類的初始化
//注意:這裏指的是將常量存放到Mytest2的常量池中,之後與MyParent2就沒有關係了,
//甚至,我們可以將MyParent2的class文件刪除


//註記符:
//ldc 表示將int,float 或是String類型的常量值從常量池推送至棧頂
//bipush 表示將單字節(-128~ 127)的常量推送至棧頂
//sipush 表示將一個短整型(-32768~ 32767)的常量推送至棧頂
//iconst_1 表示將int型 1 的常量推送至棧頂(1-5) iconst_2\iconst_5
public class Mytest2 {
    public static void main(String[] args) {
        //System.out.println(MyParent2.str);
        System.out.println(MyParent2.m); //iconst_1
    }
}
class MyParent2{
    //public static String str="Hello world";
    //final 本身是一個常量,在編譯階段這個常量存入調用這個常量的那個方法所在的類的常量池當中,因此放入到的是test2的常量池當中
    public static final String str="Hello world";
    public static final short s=7;
    public static final int i=128;
    public static final int m=1;
    static {
        System.out.println("MyParent2 static block");
    }

}

2、註記符

在編譯的目錄下,反編譯文件,會得到如下的結果,ldc就是一種註記符

註記符:
ldc 表示將int,float 或是String類型的常量值從常量池推送至棧頂
bipush 表示將單字節(-128~ 127)的常量推送至棧頂
sipush 表示將一個短整型(-32768~ 32767)的常量推送至棧頂
iconst_1 表示將int型 1 的常量推送至棧頂(1-5) iconst_2\iconst_5

jvm_lecture\build\classes\java\main> javap -c com.shengsiyuan.jvm.classloder.MyTest2

 

這是這堂課學習的註記符
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章