jvm規範:定義了
---Class檔案類型
---運作時資料
---幀棧
----虛拟機的啟動
----虛拟機的指令集
vm指令集:類型轉換,出棧入棧操作,運算,流程控制,函數調用。
jvm需要對java Library提供以下支援:
--反射java.lang.reflect
--ClassLoader
--初始化class和interface
--安全相關 java.security
--多線程
--弱引用
jvm編譯:javap進行反彙編
jvm啟動的流程:在目前路徑和系統版本找jvm.cfg檔案,根據配置找到JVM.dll,初始化JVM虛拟機獲得JNIEnv接口,找到main方法開始運作。
jvm基本結構:
pc寄存器:
每個線程擁有一個pc寄存器。
線上程建立時建立。
指向下一條指令的位址。
執行本地方法時,pc的值為undefined。
方法區:
儲存裝載的類資訊,通常和永久區關聯在一起。
類型的常量池
字段,方法資訊
方法位元組碼
java堆:
和程式開發密切相關,new出來的對象都在這裡。
應用系統對象都儲存在java堆中。
所有線程共享java堆。
對分代GC來說,堆也是分代的。
GC主要工作是區間。
java棧:
線程私有。
棧由一系列幀組成(是以棧也叫幀棧)
棧儲存一個方法的局部變量,炒作數棧,常量池指針。
每一次方法調用建立一個幀,并壓棧。
棧上配置設定:
記憶體模型:
每個線程有一個工作記憶體和主存獨立
工作記憶體存放主存中變量值得拷貝
線程共享:
線程總是在自己的本地記憶體中存儲變量,本地記憶體存儲共享記憶體變量的一個副本,共享記憶體在主存當中的,共享變量存在時延和誤差。
指令重排原則:
jvm參數設定:
-Xmx20m -Xms20m -Xmn15m -XX:+PrintGCDetails -Xloggc:log/gc.log
設定jvm參數并且将參數輸出到檔案目錄:
JVM中的新生代和老年代(Eden空間、兩個Survior空間)