淺談JVM內存分配

JVM:又叫java虛擬機,JVM是爲了項目使用軟件在不同操作系統中,模擬相同環境而誕生的。

JVM可以分爲5大

1. 方法區:

方法區是線程共享的,主要存儲虛擬機加載的類信息,常量,靜態變量等數據,在jdk1.6之前,方法區裏面還包含了運行時常量池,Class常量池和串池(字符串常量池),jdk1.7中,串池被移到了堆中。

Class常量池:主要存放編譯器生成的各種字面量和符號引用。

字面量:文本字符串,八種基本類型的值,final修飾的常量

符號引用:類和接口的權限定名,字段名稱和描述符,方法名稱   和描述符。

運行時常量池:在類加載執行時,JVM會把Class常量池中的內容放到運行時常量池中。所以運行時常量池中也存儲各種字面量和符號引用。

方法區是線程共享的,會內存溢出。

2. 虛擬機棧:

虛擬機棧是線程私有的,也就是說每一線程都會有一個屬於自己的虛擬機棧。生命週期與線程相同。存放的是java代碼中的基本數據類型,對象的引用變量,出棧,入棧,等

3. 本地方法棧

本地方法棧是線程私有的。因爲大部分的JVMCC++寫的。所以本地方法(native)中棧存放的是本地方法中的基本數據類型,對象的引用變量等。其實虛擬機棧和本地方法棧運行的原理是相似的,一個是存儲java方法中相關數據,一個是存儲本地方法中的數據

4. 

是所有線程共享的,JVM中最大的一塊區域,存儲的是對象類型數據.

比如:int[] arr = new int[3];當程序執行這行代碼時,這時JVM會在堆區分配一個長度爲3的數組對象。也就是說new int[3] 是存放在堆區的,而int[] arr 是存放在棧區的,這個棧區實際存放的是指向堆區數組的地址。

堆是垃圾收集器(GC)主要管理的區域,也被成爲GC堆。堆中還可以細分爲新生代,老年代等。

5. 程序計數器

程序計數器是一塊較小的內存空間。當程序在執行java代碼時,而這個程序計數器表示的是當前代碼的運行到的某一位置。而字節碼解釋

器是通過改變這個程序計數器的值來選取下一條需要執行的命令。

6. 類加載

概念:當JVM第一次使用類時,JVM會根據環境變量classpath找到.class文件,將.class文件中與類相關的所有語法存在JVM的內存中。

類加載只發生一次。

觸發類加載的時機:創建對象,調用靜態屬性,調用靜態方法,創建

子類對象

類加載過程就相當於人的大腦第一認識一個新的物種時,或者一個新

的朋友時的過程。當你認識一個新朋友之前,是不知道他叫什麼名字,

而當他向你做自我介紹時,你的大腦中會將這個人的特徵,面貌,名

字等存入腦海中。這個過程就類似與JVM中的類加載。

7.總結:這5大區中只有堆區和方法區是線程共享的,而只有程序計數器不會內存溢出

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