JVM各組件的功能

ClassLoader(類加載器)

什麼是類加載器?

         加載和初始化.class文件

類加載器有幾種?

3種分別是:啓動類加載器(BootStrap)

                                擴展類加載器(Extension)

                                應用程序加載器(AppClassLoader)

什麼是雙親委派?

         AppClassLoader要加載class文件不會立即加載,他會把類加載請求委派給父類加載器ExtClassLoader去完成。

         ExtClassLoader要加載class文件也不會立即加載,他會把類加載請求委派給父類加載器BootStrapClassLoader去完成。

         如果BootStrapClassLoader加載失敗(例如在$JAVA_HOME/jre/lib裏未查找到該class),他會使用ExtClassLoader進行嘗試加載。

         如果ExtClassLoader也加載失敗,會使用AppClassLoader進行加載,如果AppClassLoader也加載失敗,將會跑出異常ClassNotFoundException。

什麼是沙箱安全?

         防止隨意代碼污染java主代碼

 

Native

放在native方法棧中(不歸java管理,用於調用其他語言服務)

 

 

PC寄存器

存儲下一條指令的地址,也是當前線程執行的字節碼的行號指示器。

方法區

1.所有線程共享

2.會有垃圾回收

什麼是方法區?

a.各線程共享的運行時內存區域,存儲了類的結構信息。

b.方法區就是一個規範、模板。

例如:

         方法區 f = new 元空間()

         方法區 f = new 永久代()

相當於:List list=new ArrayList()

等號左邊是引用(reference),等號右邊是實例對象

 

** 靜態方法屬於全員方法獨一份,實例變量是自帶的變量

         實例變量存在堆中,和方法區無關

 

*************棧管運行,堆管存儲************

*java棧(stack)

棧內存不存在垃圾回收

生命週期和線程一致

stack存在哪些東西?

         8種基本數據類型的變量+對象的引用+實例方法都是在函數棧內存中分配。

**經典數據結構:

         隊列:(FIFO)先進先出

         棧:先進後出

** 8種數據類型:

         1.整數型byte(8)short(16)int(32)long(64)

         2.浮點型:double(64)float(32)

         3.布爾型:Boolean(1)

         4.字符型:char(16)

java方法 = 棧幀

**引用類型(reference)全部在棧裏面

        Person p1=new Person()

                    1.Person p1就是reference在棧中

                    2.new Person()是實例在堆中

                    3.Person類中結構信息在方法區中

棧溢出:StackOverflowError 

*heap堆

堆的邏輯結構

============================================

新生代new

         伊甸園(Eden Space)      

         倖存者0區(Survivor 0 Space)

         倖存者1區(Survivor 1 Space)

老年代old

元空間

============================================

例子:

new Person();

        new在了新生代的Eden Space

         進一步流入到Survivor 0 Space

         然後流入 Survivor 1 Space

         最後流入 old

 

Eden Space full à YGC(輕GC)

Old Space full à FGC

Full GC多次之後發現養老區沒有空間能騰出,報錯OOM

 

fromtoGC之後有交換誰空誰是to

 

** 引用類型傳內存地址

     基本數據類型傳複印件

 

Young  1/3                                                                                     Old  2/3

=================================================================

|Eden (8/10)|Survivor From(1/10)|Survivor To(1/10)|                              |

=================================================================

         複製->清空->交換

                   第一次GCEden區倖存的對象複製到Survivor From中,接着對Eden區進行清空,存活的對象年齡加一。第二次GC,掃描Eden區和Survivor From區,如果有幸存的對象直接放入Survivor to區,然後to區和from區進行互換,並且倖存的對象年齡加一。15GC之後還存活的對象直接放入Old區。

 

元空間(Perm)邏輯上屬於heap,但是實際上他是方法區的一個實現,元空間存儲的是jdk自身攜帶的ClassInterface的元數據。

        

 

棧+堆+方法區的交互關係

 

                                              

 

方法區中是模板,heap中是實例對象,棧中是對象的引用。

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