「每日五分鐘,玩轉JVM」:運行時數據區域概要

概述

咱們首先來認識一下JVM的運行時數據區域,若是說JVM是一我的,那麼運行時數據區域就是這我的的骨架,它支撐着JVM的運行,因此咱們先來學習一下運行時數據區域的分類和簡單介紹。多線程

分類

從所在區域角度上來講,能夠分爲內部內存和外部內存,其中內部的內存又包括了線程獨佔區和線程共享區。學習

在JVM內部,從線程共享角度上來講,又能夠分爲線程獨佔區和線程共享區。線程

線程獨享區能夠中包含如下三種數據區域:3d

  • 程序計數器(Program Counter Register)code

  • 虛擬機棧(VM Stack)cdn

  • 本地方法棧(Native Method Stack)對象

線程共享區中包含如下兩種數據區域:blog

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

在JVM外部也就是本地內存中,包含了直接內存元數據(Metadata),在JDK 1.8中,元數據就是咱們以前的永久代(持久代)內存

他們之間的區別是,JDK 7在持久代中的常量池在JDK 8移到了堆內存中,剩餘部分移到了元數據中。虛擬機

多線程的實現原理

上面咱們把運行時的數據區域分爲了線程獨佔區和線程共享區,那麼Java中的多線程是怎麼實現的呢?這能夠幫助咱們對於線程獨佔區和共享區有更深的理解。

在多個線程運行的時候,實際上是把CPU的使用時間分割成了無數個小份,而後根據優先級去給這些線程分配時間,CPU在這些小時間塊中快速切換,給用戶的感覺就是多線程同時在運行,以下圖:

經過這個圖,咱們能夠清晰的看出是如何達到多線程的效果(其實在通訊的時候也有一樣的原理——時分多路複用)

其實通俗一點來講,線程的獨佔區主要是爲了控制方法的正常運行,而線程的共享區更相似於一個存儲信息的倉庫

打個簡單的比方,如今有一個方法,咱們使用兩個線程同時去調用這個方法,屬於該方法的信息就能夠稱之爲獨佔區,而類中的變量,對象卻能夠被兩個方法同時使用

兩種異常

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

StackOverflowError異常出如今線程獨佔區的本地方法棧和虛擬機棧中,而OutOfMemoryError會出如今除程序計數器外的全部區域。

公衆號

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

相關文章
相關標籤/搜索