JVM(4)——对象访问
在Java語言中,對象是如何訪問的呢?對象訪問在Java語言中無處不在,是最普通的程序行為,但即使是最簡單的訪問,也會涉及Java虛擬機棧、Java堆區、方法區。
對于下面這行代碼,
Object obj = new Object();
假設這句代碼出現在方法體中,(1)那么“Objec obj”這部分的語義將會反映到Java棧的本地變量表中,作為一個reference類型數據出現;(2)而“new Object()”這部分的語義將會反映到Java堆中,形成一塊存儲了Object類型所有實例數據值的(Instance Data,對象中各個實例字段的數據)的結構化內存,根據具體類型以及虛擬機實習的對象內存布局的不同,這塊內存的長度是不固定的;另外,在Java堆中還必須包含能查找到此對象類型數據(如對象類型、父類、實現的借口、方法等)的地址信息,這些類型數據則存儲在方法區中。
主流的兩種訪問方式:使用句柄和直接指針。
使用句柄方式:Java堆中將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據和類型數據各自的具體地址信息。
使用直接指針方式:Java堆對象的布局中就必須考慮如何放置訪問類型數據的相關信息,reference中直接存儲的就是對象地址。
這兩種對象的訪問方式各有優勢,使用句柄訪問方式的最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動時只會改變句柄中的實例數據指針,而reference本身不需要被修改。
使用直接指針訪問方式的最大好處就是速度更快,它節省了一次指針定位的時間開銷。Sun HotSpot虛擬機使用的是這種方式。
總結
以上是生活随笔為你收集整理的JVM(4)——对象访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM(3)——JVM类加载器
- 下一篇: 第一篇博客,写在颓废之时