1. 程式人生 > >Java記憶體區域-簡介

Java記憶體區域-簡介

我們從學習Java的第一天開始,老師就告訴我們說,Java語言相比較C或者C++,它有一個非常強大的地方,就是它的記憶體的管理,我們使用Java不需要自己來申請記憶體、釋放記憶體等等,這一切的工作都由Java虛擬機器來幫助我們完成,發現我們在寫程式碼的過程中也就不需要再管理我們的記憶體了,但是,隨著我們學習的深入,我們始終會出現一些莫名的問題,比如說記憶體的溢位,等等,那麼,我們就開始注意到Java虛擬機器了,這個時候我們就去了解Java虛擬機器的記憶體管理。

我們先來看一下官方給我們的執行時資料區域的劃分

主要分為兩大塊,執行緒共享區執行緒獨佔區

每一個執行緒就是一個順序的執行單元,其實執行緒獨佔區就是每一個執行緒它都有自己的這麼一塊區域,就是每一個執行緒都有它自己的程式計數器

本地方法棧虛擬機器棧。所謂的執行緒共享區就是多個執行緒共享這同一塊區域。

如果說這是我們的程式

程式裡面有多個執行緒共同執行

對於執行緒獨佔區的記憶體區域來講,在每一個執行緒中,它都會分配這麼一塊記憶體區域,每一個執行緒裡面是獨立的,比如說程式計數器,每個執行緒裡面都會有自己的程式計數器

那麼,對於執行緒共享區就不一樣了,方法區和堆是處於所有執行緒所共享的區域,就這一塊區域,所有的執行緒共享

我們來具體的看一下這每個區域的簡單介紹

執行緒共享區中:

  1. 方法區:儲存執行時常量池、已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。
  2. Java堆:儲存物件例項。

執行緒獨佔區中:

  1. 虛擬機器棧:存放方法執行時所需的資料,稱為棧幀。其實,虛擬機器棧描述的就是方法的記憶體模型。
  2. 本地方法棧:為JVM所呼叫的Native即本地方法服務。

程式計數器:記錄當前執行緒所執行到的位元組碼的行號。這個行號其實是一個標識。程式計數器這個記憶體區域是一個非常簡單的記憶體區域,而且它佔用的記憶體空間也是比較小的。