NO IMAGE

最近選擇性的看了深入理解java虛擬機器這本書,挑了幾章對於深入android開發有幫助的章節,大廠面試android或者java的時候也可能會問到,所以大家有愛自取。

1.java記憶體管理

很多人都只知道java的記憶體分為堆和棧,但是其實裡面有更多東西,要成為一個高階java/android 開發者對於虛擬機器簡單瞭解是必不可少的,所以上一張圖,讓大家方面記憶。

java記憶體管理

簡書上傳圖片會被壓縮所以大家用這張圖片吧:
https://img-blog.csdn.net/20170423141113568?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEwMTg5OTg2MzI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

2.class檔案的結構

檢視java位元組碼也是高階java開發者所不可缺少的技能,所以我總結了一張class檔案的結構圖,大家可以看看。

class檔案組成

簡書上傳圖片會被壓縮所以大家用這張圖片吧:
https://img-blog.csdn.net/20170306172800420?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTEwMTg5OTg2MzI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

3.java虛擬機器的方法呼叫

方法的呼叫並不等於方法的執行,java的方法呼叫不像c 一樣在編譯期就知道了方法的具體記憶體地址,當一個方法被呼叫了,只是class的常量池中的符號引用被呼叫,而符號引用會在類載入期間或者執行期間指向真正的方法的記憶體地址,這就給java帶來了強大的動態擴充套件能力。

  • 1.解析:所有方法呼叫都是Class檔案中的一個符號引用,在Class載入的階段,有一些符號引用會轉化成直接引用(記憶體中具體方法的地址),這個解析成功的前提就是在執行過程中這個方法是不能被改變的。這類執行期不變的方法呼叫被稱為解析。
    • 1.私有方法和靜態方法就是這類方法,前者不可被外部呼叫,後者與類直接相關。所以會在類載入階段被解析。
    • 2.invokestatic和invokespecial這兩條位元組碼指令就與上面的倆者對應,這些方法統稱為非虛方法。此外還有一種被final的方法,因為這種方法不能被覆蓋所以雖然其是由invokevirtual指令來呼叫,但是其依然是非虛方法。
  • 2.分派: [http://blog.csdn.net/ns_code/article/details/17965867](http://blog.csdn.net/ns_code/article/details/17965867 分派”)