03.18 Java程序猿,你們應該瞭解的JVM內存結構

JVM,算是Java裡面最根本的部分了,沒有它,Java就成了無源之水,無本之木,所以,之後小編會花費若干篇文章的精力,慢慢解釋這部分內容,每一章介紹一小部分,也方便大家的記憶。

幾個重要概念

Java虛擬機(Java Virtual Machine,縮寫JVM)

Java開發工具包(java development kit,縮寫jdk)

Java運行時環境(java runtime environment,縮寫jre)

JVM內存結構

先上個圖

Java程序猿,你們應該瞭解的JVM內存結構

JVM在執行Java代碼的時候,會把內存分為五個部分來使用,我們稱之為運行時數據區

程序計數器

程序計數器,也就是我們常說的PC寄存器

每個線程剛創建時,會創建一個程序計數器,它的生命週期跟隨線程而變,同生共死

主要作用:當前線程所執行程序的字節碼的行號指示器,通過它可以獲取下一條需要執行的字節碼指令。

這麼說大家可能不太明白,舉個例子來說,假如有兩個線程A和B,當前A正在執行,如果此時CPU切換B線程執行,那麼當A重新拿到CPU使用權的時候,是如何找到之前暫停的位置呢?

沒錯,就是通過程序計數器。這也是為什麼每條線程都需要有一個獨立的程序計數器的原因。(線程私有內存)

堆(面試常考)

堆是JVM中最大的一塊內存區域,而且被所有的線程所共享,幾乎所有的對象實例都放在這裡(簡單點說,就是我們new出來的對象啦)

這裡有很多面試經常考察的知識點,比如:

  1. 垃圾回收算法(堆是JVM進行垃圾回收的主要區域)

  2. 什麼情況下會報出OutOfMemoryError異常

  3. 堆的劃分區域,以及每個區域是如何進行垃圾回收的(可以分為新生代和老年代,新生代又可以分為Eden空間、From Survivor空間、To Survivor空間等)

  4. 不同種類的垃圾回收器異同點

以上這些知識每一個問題都能單獨寫篇文章介紹,感興趣的小夥伴可以繼續關注小編,小編會在之後的文章中一一解答。

虛擬機棧(面試常考)

虛擬機棧,也是線程私有的,它也是隨著線程的創建而創建,同生共死。

既然是一個棧,自然就擁有棧的數據結構,它由一個個棧幀組成。

每一幀裡面保存的是每個線程中執行方法的相關信息,包括一個方法的局部變量,常量池指針,方法出口等信息。

就像棧的基本操作一樣,每次線程調用一個方法的時候,就會形成一個棧幀,並壓入棧中,當方法執行完成,則執行出棧操作。

方法調用的過程正好和棧的先入後出過程相似。

如果棧的深度過深,則表明,棧幀過多,也就是執行的方法過多,程序會報StackOverFlowError。

方法區(面試常考)

方法區,也被稱作永久代,和堆一樣,是所有線程內存共享的區域。

主要用來保存被虛擬機加載的類信息,靜態變量,常量等。

這裡還專門開闢了一塊稱之為運行時常量池的區域,不僅用來存放普通常量池中有關編譯期間生成的各種字面量和符號引用,還可以在程序執行期間動態加入新的常量(比如通過String.intern()方法)

本地方法棧

本地方法棧的作用和虛擬機棧的作用相似,只不過虛擬機棧是為虛擬機執行Java方法服務,本地方法棧是為本地方法服務(本地方法不一定是Java語言,可能是C或C++語言哦)

注意

在這裡,有兩點再次強調一下:

  1. 方法區和堆裡的數據是由所有線程共享的(紫色區域)

  2. 程序計數器,虛擬機棧,本地方法棧的數據是線程間隔離的,無法共享的(橙色區域)

以上所介紹的內容,只是JVM內存結構五部分最基礎的概念,每一部分延伸開來,都可以形成若干篇文章,之後小編會慢慢講解(對自己也是一個提高的過程),所以你們一定要關注哦!

Java程序猿,你們應該瞭解的JVM內存結構


分享到:


相關文章: