天天看點

Java虛拟機---虛拟機概述天使總在想象中,魔鬼總在細節處一、Java虛拟機組成部分二、各部分功能

java 虛拟機

  • 天使總在想象中,魔鬼總在細節處
  • 一、Java虛拟機組成部分
  • 二、各部分功能
    • 1、類加載子系統:負責從檔案系統或者網絡中加載class資訊。Java對象的建立過程中,類對象的加載便是由其負責。
    • 2、方法區(永久代PermGen):加載的類資訊放在方法區中,方法區還包括運作時常量資訊,如:字元串字面量和數字常量。
      • 補充:
    • 3、java堆:在虛拟機啟動時建立,幾乎所有的java對象都放在java堆中。堆空間時線程所共享的。
      • 補充:
    • 4、java棧 :每一個虛拟機線程都有一個私有的java棧,java棧中儲存着棧幀的資訊,java棧中儲存着局部變量表、方法參數,同時和java方法的調用、傳回密切相關。
      • 補充:
    • 5、本地方法棧:類似于Java棧,最大的不同在于本地方法棧用于本地方法的調用。
    • 6、垃圾回收系統:垃圾回收器可以對方法區、Java堆、直接記憶體進行回收。
    • 7、pc程式計數器:每個線程的私有空間,可以看作是目前的線程所執行位元組碼的行号訓示器。
    • 8、執行引擎: 負責虛拟機的位元組碼

天使總在想象中,魔鬼總在細節處

Java虛拟機---虛拟機概述天使總在想象中,魔鬼總在細節處一、Java虛拟機組成部分二、各部分功能

一、Java虛拟機組成部分

Java虛拟機由九部分組成:類加載子系統,方法區,java堆,直接記憶體,垃圾回收系統,Java棧,本地方法棧,pc寄存器,直接引擎。

Java虛拟機---虛拟機概述天使總在想象中,魔鬼總在細節處一、Java虛拟機組成部分二、各部分功能

二、各部分功能

1、類加載子系統:負責從檔案系統或者網絡中加載class資訊。Java對象的建立過程中,類對象的加載便是由其負責。

2、方法區(永久代PermGen):加載的類資訊放在方法區中,方法區還包括運作時常量資訊,如:字元串字面量和數字常量。

補充:

   java8去除PermGen,将其中的方法區移到non-heap中的Metaspace。

  Metaspace并不在虛拟機中,而是使用本地記憶體。若是不指定該區域的大小,預設情況下,虛拟機可能會耗盡所有的可用系統記憶體。

  和java堆一樣,方法區也是一塊線程所共享的記憶體區域,用于儲存系統的類資訊:比如類的字段,方法,常量池等。方法區的大小決定了系統能夠儲存多少個類,若系統定義了太多的類,會造成記憶體溢出異常。

3、java堆:在虛拟機啟動時建立,幾乎所有的java對象都放在java堆中。堆空間時線程所共享的。

補充:

  根據垃圾回收機制的不同,java堆可能擁有不同的結構,最常見的是将整個java堆分為新生代和老年代;

  一般情況下,新建立的對象都會被配置設定到Eden區(新生代中的一部分,新生代分為Eden和兩個s區),這些對象經過第一次新生代回收後,如果對象還存活,則進入S0或者S1區中,之後每一次新生代的回收,他若仍然存在s區中,則它的年齡就會加1,當達到一定年齡後,它就會被認為時老年對象,進而進入老年代。

4、java棧 :每一個虛拟機線程都有一個私有的java棧,java棧中儲存着棧幀的資訊,java棧中儲存着局部變量表、方法參數,同時和java方法的調用、傳回密切相關。

補充:

  目前正在執行的函數對應的棧幀就是目前的幀(位于棧頂);

  每次函數調用都會生成對應的棧幀,進而占用一定的棧空間,如果棧空間不足,則會抛出StackOverflowError異常(棧溢出異常);

  每次函數的調用都是Java棧負責傳遞,每次調用都會生成對應的棧幀,進而占用一定的棧空間,函數調用過于頻繁,則一定時間内的棧空間消耗過快,資源回收不及時,就會造成棧溢出異常。

5、本地方法棧:類似于Java棧,最大的不同在于本地方法棧用于本地方法的調用。

6、垃圾回收系統:垃圾回收器可以對方法區、Java堆、直接記憶體進行回收。

7、pc程式計數器:每個線程的私有空間,可以看作是目前的線程所執行位元組碼的行号訓示器。

8、執行引擎: 負責虛拟機的位元組碼