當前位置:首頁 » 服務存儲 » 線程本地變數存儲位置
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

線程本地變數存儲位置

發布時間: 2023-03-06 17:47:52

⑴ java線程存放在jvm的哪個區域方法又存放在哪個區呢

聊到JAVA中的方法,大多數人對於方法存儲在方法區還是棧區(虛擬機棧)是很迷茫的。其實方法是存在方法區的下面我們就細細說一下JVM中的 方法區 VS 棧區方法區:用於存儲已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據,方法編譯出的位元組碼也是保存在這

⑵ 靜態變數存儲在哪個區

對於一個進程的內存空間而言,可以在邏輯上分成3個部份:代碼區,靜態數據區和動態數據區。
動態數據區一般就是「堆棧」。 棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的「棧」。
全局變數和靜態變數分配在靜態數據區(全局區),本地變數分配在動態數據區,即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變數。

⑶ ThreadLocal問題 當前線程中的ThreadLocalMap變數哪來的

t.threadLocals 是當前線程Thread(t) 的成員變數, 當使用 ThreadLocal 創建對象後,調用 ThreadLocal.set()方法會看到初始化 ThreadLocalMap的過程,JDK內部實現代碼截圖如下:

(1)調用set方法,初始化 ThreadLocalMap 對象,如果getMap(t)獲取當前線程 threadLocals 變數為空,隨後創建一個;反之,直接使用存儲線程數據.

⑷ jvm中線程本地內存是真實存在的,還是一個抽象概念

jvm內存模型:Java代碼是運行在Java虛擬機之上的,由Java虛擬機通過解釋執行(解釋器)或編譯執行(即時編譯器)來完成,故Java內存模型,也就是指Java虛擬機的運行時內存模型。

運行時內存模型,分為線程私有和共享數據區兩大類,其中線程私有的數據區包含程序計數器、虛擬機棧、本地方法區,所有線程共享的數據區包含Java堆、方法區,在方法區內有一個常量池。java運行時的內存模型圖,如下:

從圖中,可知內存分為線程私有和共享兩大類:

(1)線程私有區,包含以下3類:
程序計數器,記錄正在執行的虛擬機位元組碼的地址;
虛擬機棧:方法執行的內存區,每個方法執行時會在虛擬機棧中創建棧幀;
本地方法棧:虛擬機的Native方法執行的內存區;

(2)線程共享區,包含以下2類
Java堆:對象分配內存的區域;
方法區:存放類信息、常量、靜態變數、編譯器編譯後的代碼等數據;
常量池:存放編譯器生成的各種字面量和符號引用,是方法區的一部分。

樓主提到的Java棧,一般而言是指圖中的虛擬機棧,在代碼中的方法調用過程中,往往需要從一個方法跳轉到另一個方法,執行完再返回,那麼在跳轉之前需要在當前方法的基本信息壓入棧中保存再跳轉。

三、關於寄存器的問題

對於java最常用的虛擬機,sun公司提供的hotspot虛擬機,是基於棧的虛擬機;而對於android的虛擬機,則採用google提供的dalvik,art兩種虛擬機,在android 5.0以後便默認採用art虛擬機,這是基於寄存器的虛擬機。 樓主問的是jvm(即java vm),這是基於棧的虛擬機。那麼關於虛擬機棧,這塊內存的內容,我們再進一步詳細分析,如下圖:

可以看到,在虛擬機棧有一幀幀的 棧幀組成,而棧幀包含局部變數表,操作棧等子項,那麼線程在運行的時候,代碼在運行時,是通過程序計數器不斷執行下一條指令。真正指令運算等操作時通過控制操作棧的操作數入棧和出棧,將操作數在局部變數表和操作棧之間轉移。

⑸ ThreadLocal一般用在哪些地方有何用

從如下8點來講解一下:
1.ThreadLocal用來解決多線程程序的並發問題
2.ThreadLocal並不是一個Thread,而是Thread的局部變數,當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的線程提供獨立的變數副本,所以每個線程都
可以獨立地改變自己的副本,而不會影響其它線程所對應的副本.
3.從線程的角度看,目標變數就象是線程的本地變數,這也是類名中「Local」所要表達的意思。
4.線程局部變數並不是Java的新發明,Java沒有提供在語言級支持(語法上),而是變相地通過ThreadLocal的類提供支持.
5.ThreadLocal類中的方法:(JDK5版本之後支持泛型)
void set(T value)
將此線程局部變數的當前線程副本中的值設置為指定值
void remove()
移除此線程局部變數當前線程的值
protected T initialValue()
返回此線程局部變數的當前線程的「初始值」
T get()
返回此線程局部變數的當前線程副本中的值
6.ThreadLocal的原理:
ThreadLocal是如何做到為每一個線程維護變數的副本的呢?其實實現的思路很簡單:在ThreadLocal類中有一個Map,用於存儲每一個線程的變數副本,Map中元素
的鍵為線程對象,而值對應線程的變數副本
7.自己模擬ThreadLocal:
public class SimpleThreadLocal{
private Map valueMap=Collections.synchronizedMap(new HashMap());
public void set(Object newValue){
valueMap.put(Thread.currentThread(),newValue);//鍵為線程對象,值為本線程的變數副本
}