Java記憶體區域-簡介
阿新 • • 發佈:2018-11-19
我們從學習Java的第一天開始,老師就告訴我們說,Java語言相比較C或者C++,它有一個非常強大的地方,就是它的記憶體的管理,我們使用Java不需要自己來申請記憶體、釋放記憶體等等,這一切的工作都由Java虛擬機器來幫助我們完成,發現我們在寫程式碼的過程中也就不需要再管理我們的記憶體了,但是,隨著我們學習的深入,我們始終會出現一些莫名的問題,比如說記憶體的溢位,等等,那麼,我們就開始注意到Java虛擬機器了,這個時候我們就去了解Java虛擬機器的記憶體管理。
我們先來看一下官方給我們的執行時資料區域的劃分
主要分為兩大塊,執行緒共享區和執行緒獨佔區。
每一個執行緒就是一個順序的執行單元,其實執行緒獨佔區就是每一個執行緒它都有自己的這麼一塊區域,就是每一個執行緒都有它自己的程式計數器
如果說這是我們的程式
程式裡面有多個執行緒共同執行
對於執行緒獨佔區的記憶體區域來講,在每一個執行緒中,它都會分配這麼一塊記憶體區域,每一個執行緒裡面是獨立的,比如說程式計數器,每個執行緒裡面都會有自己的程式計數器
那麼,對於執行緒共享區就不一樣了,方法區和堆是處於所有執行緒所共享的區域,就這一塊區域,所有的執行緒共享
我們來具體的看一下這每個區域的簡單介紹
執行緒共享區中:
- 方法區:儲存執行時常量池、已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。
- Java堆:儲存物件例項。
執行緒獨佔區中:
- 虛擬機器棧:存放方法執行時所需的資料,稱為棧幀。其實,虛擬機器棧描述的就是方法的記憶體模型。
- 本地方法棧:為JVM所呼叫的Native即本地方法服務。
程式計數器:記錄當前執行緒所執行到的位元組碼的行號。這個行號其實是一個標識。程式計數器這個記憶體區域是一個非常簡單的記憶體區域,而且它佔用的記憶體空間也是比較小的。