java 面試知識點筆記(二)底層知識 jvm 內存模型 上篇

問:你瞭解java的內存模型嘛?java

內存簡介:數組

地址空間劃分數據結構

  • 內核空間(主要是操做系統程序和C運行時的空間,包含連接硬件、調度程序、提供聯網、虛擬內存等邏輯和基於C的進程)
  • 用戶空間(java實際運行時使用的空間,32位系統最多訪問3G,內核代碼能夠訪問全部物理內存。64位系統能夠訪問超過512G,內核代碼一樣能夠訪問全部物理內存)

jvm內存模型--jdk8及之後多線程

  • 線程私有:程序計數器、虛擬機棧、本地方法棧
  • 線程共享:MetaSpace(元空間)、java堆

程序計數器(是一塊較小的內存空間,線程私有)jvm

  • 當前線程所執行的字節碼行號指示器(邏輯)
  • 改變計數器的值來選取下一條須要執行的字節碼指令(分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴計數器)
  • 和線程是一對一的關係即「線程私有內存」(jvm是多線程運行的,爲了確保切換線程後能恢復到每一個線程原來運行的位置就須要私有程序計數器)
  • 對java方法技術,若是是Native方法則計數器位Undefined
  • 不會發生內存泄漏(由於只是記錄了行號)

java虛擬機棧(stack,線程私有)this

  • java方法執行的內存模型
  • 包含多個棧幀(方法運行的基礎數據結構,包含局部變量表、操做棧、動態連接、返回地址等入棧到出棧的過程。棧幀持有局部變量、部分結果、參與方法的調用與返回,方法調用結束時幀纔會被銷燬。)

局部變量表和操做數棧操作系統

  • 局部變量表:包含方法執行過程當中的全部變量(包括this引用、全部方法參數、其餘局部變量)
  • 操做數棧:入棧、出棧、複製、交換、產生消費變量(在執行字節碼指令過程當中被用到,這種方式相似於原生cpu寄存器,大部分jvm字節碼把時間花費在操做數棧的操做上,所以局部變量的數組和操做數棧的操做指令經過字節碼頻繁執行)

實例:線程

編譯二進制,再反編譯字節碼 (這裏javac的時候遇到了個小問題,由於中文註釋的緣由,GBK不可映射字符 因此加上 -endcoding UTF-8 解決問題)3d

descript:(II)I 表示描述方法:有2個int參數 返回int, flags 標記public的 static的blog

stack=2 操做數棧 深度2 ,locals 本地變量是3 ,args_size參數大小是2個

而後就是一堆進棧出棧的指令

LineNumberTable是代碼的行號對應字節碼行號

執行add(1,2)過程:

問:遞歸爲何會引起java.lang.StackOverflowError異常?

遞歸過深,棧幀數超出虛擬棧深度  解決方法就是減小遞歸次數或者循環替換遞歸

虛擬機棧過多會引起java.lang.OutOfMemoryError異常

虛擬機棧不須要GC回收,用完就會釋放掉

 

本地方法棧:

  • 與虛擬機棧類似,主要做用於標註了native的方法
相關文章
相關標籤/搜索