點選上方“芋道原始碼”,選擇“置頂公眾號”
技術文章第一時間送達!
原始碼精品專欄
JVM的記憶體結構
根據 JVM 規範,JVM 記憶體共分為虛擬機器棧、堆、方法區、程式計數器、本地方法棧五個部分。
1、Java虛擬機器棧:
執行緒私有;每個方法在執行的時候會建立一個棧幀,儲存了區域性變數表,運算元棧,動態連線,方法傳回地址等;每個方法從呼叫到執行完畢,對應一個棧幀在虛擬機器棧中的入棧和出棧。
2、堆:
執行緒共享;被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立,用於存放物件實體。
3、方法區:
執行緒共享;被所有執行緒共享的一塊記憶體區域;用於儲存已被虛擬機器載入的類資訊,常量,靜態變數等。
4、程式計數器:
執行緒私有;是當前執行緒所執行的位元組碼的行號指示器,每條執行緒都要有一個獨立的程式計數器,這類記憶體也稱為“執行緒私有”的記憶體。
5、本地方法棧:
執行緒私有;主要為虛擬機器使用到的Native方法服務。
大體回答如上,類似文章請移駕:
強取用,軟取用和弱取用的區別
強取用:
只有這個取用被釋放之後,物件才會被釋放掉,只要取用存在,垃圾回收器永遠不會回收,這是最常見的New出來的物件。
軟取用:
記憶體上限溢位之前透過程式碼回收的取用。軟取用主要使用者實現類似快取的功能,在記憶體足夠的情況下直接透過軟取用取值,無需從繁忙的真實來源查詢資料,提升速度;當記憶體不足時,自動刪除這部分快取資料,從真正的來源查詢這些資料。
弱取用:
第二次垃圾回收時回收的取用,短時間內透過弱取用取對應的資料,可以取到,當執行過第二次垃圾回收時,將傳回null。弱取用主要用於監控物件是否已經被垃圾回收器標記為即將回收的垃圾,可以透過弱取用的isEnQueued方法傳回物件是否被垃圾回收器標記。
大體回答如上,類似文章請移駕:
陣列在記憶體中如何分配
1、簡單的值型別的陣列,每個陣列成員是一個取用(指標),取用到棧上的空間(因為值型別變數的記憶體分配在棧上)
2、取用型別,型別別的陣列,每個陣列成員仍是一個取用(指標),取用到堆上的空間(因為類的實體的記憶體分配在堆上)
用過哪些設計樣式,手寫一個(除單例)
設計樣式早有總結,看這裡:23種設計樣式完整總結
springmvc的核心是什麼,請求的流程是怎麼處理的,控制反轉怎麼實現的
核心:
控制反轉和麵向切麵
請求處理流程:
1、首先使用者傳送請求到前端控制器,前端控制器根據請求資訊(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委託給它,即以前的控制器的控制邏輯部分;
2、頁面控制器接收到請求後,進行功能處理,首先需要收集和系結請求引數到一個物件,併進行驗證,然後將命令物件委託給業務物件進行處理;處理完畢後傳回一個ModelAndView(模型資料和邏輯檢視名);
3、前端控制器收回控制權,然後根據傳回的邏輯檢視名,選擇相應的檢視進行渲染,並把模型資料傳入以便檢視渲染;
4、前端控制器再次收回控制權,將響應傳回給使用者。
控制反轉如何實現:
我們每次使用spring框架都要配置xml檔案,這個xml配置了bean的id和class。
spring中預設的bean為單實體樣式,透過bean的class取用反射機制可以建立這個實體。
因此,spring框架透過反射替我們建立好了實體並且替我們維護他們。
A需要取用B類,spring框架就會透過xml把B實體的取用傳給了A的成員變數。
大體回答如上,類似文章請移駕:
spring裡面的aop的原理是什麼
這個有介紹,看這裡:Spring的IOC原理
mybatis如何處理結果集
MyBatis的結果集是透過反射來實現的。並不是透過get/set方法。在物體類中無論是否定義get/set()方法,都是可以接收到的。
如果面試只是考你這個點的話就恭喜了。如果繼續深問流程,那就需要自己找一些原始碼來閱讀了。
java的多型表現在哪裡
主要有兩種表現形式:多載和重寫
多載:
是發生在同一類中,具有相同的方法名,主要是看引數的個數,型別,順序不同實現方法的多載的,傳回值的型別可以不同。
重寫:
是發生在兩個類中(父類和子類),具有相同的方法名,主要看方法中引數,個數,型別必須相同,傳回值的型別必須相同。
大體回答如上,類似文章請移駕: