概述
我們首先來認識一下JVM
的執行時資料區域,如果說JVM
是一個人,那麼執行時資料區域就是這個人的骨架,它支撐著JVM的執行,所以我們先來學習一下執行時資料區域的分類和簡單介紹。
分類
從所在區域角度上來說,可以分為內部記憶體和外部記憶體,其中內部的記憶體又包括了執行緒獨佔區和執行緒共享區。
在JVM內部,從執行緒共享角度上來說,又可以分為執行緒獨佔區和執行緒共享區。
執行緒獨享區可以中包含以下三種資料區域:
程式計數器(Program Counter Register)
虛擬機器棧(VM Stack)
本地方法棧(Native Method Stack)
執行緒共享區中包含以下兩種資料區域:
- 方法區(Method Area)
- 堆(Heap)
在JVM外部也就是本地記憶體中,包含了直接記憶體和後設資料(Metadata),在JDK 1.8中,後設資料就是我們之前的永久代(持久代)
他們之間的區別是,JDK 7在持久代中的常量池在JDK 8移到了堆記憶體中,剩餘部分移到了後設資料中。
多執行緒的實現原理
上面我們把執行時的資料區域分為了執行緒獨佔區和執行緒共享區,那麼Java中的多執行緒是怎麼實現的呢?這可以幫助我們對於執行緒獨佔區和共享區有更深的理解。
在多個執行緒執行的時候,其實是把CPU的使用時間分割成了無數個小份,然後根據優先順序去給這些執行緒分配時間,CPU在這些小時間塊中快速切換,給使用者的感受就是多執行緒同時在執行,如下圖:
通過這個圖,我們可以清晰的看出是如何達到多執行緒的效果(其實在通訊的時候也有同樣的原理——時分多路複用)
其實通俗一點來說,執行緒的獨佔區主要是為了控制方法的正常執行,而執行緒的共享區更類似於一個儲存資訊的倉庫。
打個簡單的比方,現在有一個方法,我們使用兩個執行緒同時去呼叫這個方法,屬於該方法的資訊就可以稱之為獨佔區,而類中的變數,物件卻可以被兩個方法同時使用。
兩種異常
在和JVM打交道的過程中,我們經常會遇到兩種錯誤:StackOverflowError
和OutOfMemoryError
,
StackOverflowError
異常出現線上程獨佔區的本地方法棧和虛擬機器棧中,而OutOfMemoryError
會出現在除程式計數器外的所有區域。
公眾號
原創文章,才疏學淺,如有不對之處,萬望告知!