文章出處鏈接:https://www.zhihu.com/question/19748817/answer/88610988
參考文章:[Jvm系列1—運行時內存結構](http://gityuan.com/2015/10/17/java-memory/)
這個問題,要從線程和內存兩個角度來講解。
**一、線程**
線程從linux角度來看就是task\_struct結構體,是一段可執行的代碼,CPU調度的最小單位,這個不是樓主問題的重點,這里就不展開了;
**二、其次關于Java棧和的寄存器問題,先來看看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),這是基于棧的虛擬機。那么關于虛擬機棧,這塊內存的內容,我們再進一步詳細分析,如下圖:

可以看到,在虛擬機棧有一幀幀的 棧幀組成,而棧幀包含局部變量表,操作棧等子項,那么線程在運行的時候,代碼在運行時,是通過程序計數器不斷執行下一條指令。真正指令運算等操作時通過控制操作棧的操作數入棧和出棧,將操作數在局部變量表和操作棧之間轉移。
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制