JVM(二):畫骨

Vi的技術部落格發表於2019-08-05

概述

我們首先來認識一下JVM的執行時資料區域,如果說JVM是一個人,那麼執行時資料區域就是這個人的骨架,它支撐著JVM的執行,所以我們先來學習一下執行時資料區域的分類和簡單介紹。

分類

從所在區域角度上來說,可以分為內部記憶體和外部記憶體,其中內部的記憶體又包括了執行緒獨佔區和執行緒共享區。

JVM(二):畫骨

在JVM內部,從執行緒共享角度上來說,又可以分為執行緒獨佔區和執行緒共享區。

執行緒獨享區可以中包含以下三種資料區域:

  • 程式計數器(Program Counter Register)

  • 虛擬機器棧(VM Stack)

  • 本地方法棧(Native Method Stack)

執行緒共享區中包含以下兩種資料區域:

  • 方法區(Method Area)
  • 堆(Heap)

在JVM外部也就是本地記憶體中,包含了直接記憶體後設資料(Metadata),在JDK 1.8中,後設資料就是我們之前的永久代(持久代)

他們之間的區別是,JDK 7在持久代中的常量池在JDK 8移到了堆記憶體中,剩餘部分移到了後設資料中。

JVM(二):畫骨

多執行緒的實現原理

上面我們把執行時的資料區域分為了執行緒獨佔區和執行緒共享區,那麼Java中的多執行緒是怎麼實現的呢?這可以幫助我們對於執行緒獨佔區和共享區有更深的理解。

在多個執行緒執行的時候,其實是把CPU的使用時間分割成了無數個小份,然後根據優先順序去給這些執行緒分配時間,CPU在這些小時間塊中快速切換,給使用者的感受就是多執行緒同時在執行,如下圖:

image-20190803142000793

通過這個圖,我們可以清晰的看出是如何達到多執行緒的效果(其實在通訊的時候也有同樣的原理——時分多路複用)

其實通俗一點來說,執行緒的獨佔區主要是為了控制方法的正常執行,而執行緒的共享區更類似於一個儲存資訊的倉庫

打個簡單的比方,現在有一個方法,我們使用兩個執行緒同時去呼叫這個方法,屬於該方法的資訊就可以稱之為獨佔區,而類中的變數,物件卻可以被兩個方法同時使用

兩種異常

在和JVM打交道的過程中,我們經常會遇到兩種錯誤:StackOverflowErrorOutOfMemoryError

StackOverflowError異常出現線上程獨佔區的本地方法棧和虛擬機器棧中,而OutOfMemoryError會出現在除程式計數器外的所有區域。

image-20190803144254116

公眾號

JVM(二):畫骨

原創文章,才疏學淺,如有不對之處,萬望告知!

相關文章