原博客地址:http://www.solr.cc/blog/?p=242
今天說說 java的對象訪問.
對象訪問會涉及到 棧、堆、方法區這三個內存區域。對象訪問主要有兩種:句柄訪問和指針放訪問。
上圖(源於網絡):
前面我們分析過內存各部分的功能,棧中存放的是變量表,堆中存放對象實例,方法去存放類信息(如類名 父類 接口實現等)。這樣從兩個圖中不難發現訪問對象的流程是一致 都是通過棧中對象的引用到堆中尋找實例,實例又需要到方法區中找到類的基本信息。兩者不同的地方在於堆的處理上。
通過句柄進行訪問:將堆又劃分爲兩個區域句柄區和實例區,棧中的reference指向句柄區的句柄,句柄我們可以理解爲存放兩個指針的結構體。一個存儲實例區的地址,一個指向方法區的地址。
通過引用訪問:棧中reference直接指向實例對象,實例對象中直接記錄方法區中的地址。
優缺點:通用JDK使用的是通過引用直接訪問的方式,優點就是訪問性能高(比句柄訪問少一次尋址),缺點就是對象遷移(拷貝)頻繁,在垃圾回收過程中消耗更多的資源。