亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

藍山帝景 2019-11-12 14:10:08
jvm中線程本地內存是真實存在的,還是一個抽象概念
查看完整描述

3 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

是一個抽象的概念,并不是真實存在的,涵蓋了緩存、寫緩沖區、寄存器以及其他的硬件和編譯器優化,每一個線程都有一個本地內存,其中有主內存中對象的拷貝值,

查看完整回答
反對 回復 2019-11-16
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

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),這是基于棧的虛擬機。那么關于虛擬機棧,這塊內存的內容,我們再進一步詳細分析,如下圖:

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

查看完整回答
反對 回復 2019-11-16
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

我看過的理論好像是
堆的話,好像是全局一個,所有 用new生成的對象,都保存在堆里。
但是 按照這種理論,我也有點不懂的地方。 以垃圾回收的理論來看的話,最好的方法是 一個棧對應一個堆,然后方法棧執行完畢,清空這一個堆,垃圾回收舊算完了。這樣的方式 感覺比單純一個全局的堆 要好。

全局一個堆的話, 要維護 每個線程對應的 內存對象,垃圾回收 還得針對每一個線程,感覺有點復雜。
全局的堆 肯定是有一個的,維護那些 靜態變量的 內存,公有的一些對象。
其實我也不怎么懂 jvm里面 具體的內存分配策略。 可是是錯的

查看完整回答
反對 回復 2019-11-16
  • 3 回答
  • 0 關注
  • 1231 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號