JVM的內(nèi)存結(jié)構(gòu)
根據(jù) JVM 規(guī)范,JVM 內(nèi)存共分為虛擬機(jī)棧、堆、方法區(qū)、程序計(jì)數(shù)器、本地方法棧五個部分。
1、Java虛擬機(jī)棧:
線程私有;每個方法在執(zhí)行的時候會創(chuàng)建一個棧幀,存儲了局部變量表,操作數(shù)棧,動態(tài)連接,方法返回地址等;每個方法從調(diào)用到執(zhí)行完畢,對應(yīng)一個棧幀在虛擬機(jī)棧中的入棧和出棧。
2、堆:
線程共享;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建,用于存放對象實(shí)例。
3、方法區(qū):
線程共享;被所有線程共享的一塊內(nèi)存區(qū)域;用于存儲已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量等。
4、程序計(jì)數(shù)器:
線程私有;是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,每條線程都要有一個獨(dú)立的程序計(jì)數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存。
5、本地方法棧:
線程私有;主要為虛擬機(jī)使用到的Native方法服務(wù)。
大體回答如上,類似文章請移駕:
強(qiáng)引用,軟引用和弱引用的區(qū)別
強(qiáng)引用:
只有這個引用被釋放之后,對象才會被釋放掉,只要引用存在,垃圾回收器永遠(yuǎn)不會回收,這是最常見的New出來的對象。
軟引用:
內(nèi)存溢出之前通過代碼回收的引用。軟引用主要用戶實(shí)現(xiàn)類似緩存的功能,在內(nèi)存足夠的情況下直接通過軟引用取值,無需從繁忙的真實(shí)來源查詢數(shù)據(jù),提升速度;當(dāng)內(nèi)存不足時,自動刪除這部分緩存數(shù)據(jù),從真正的來源查詢這些數(shù)據(jù)。
弱引用:
第二次垃圾回收時回收的引用,短時間內(nèi)通過弱引用取對應(yīng)的數(shù)據(jù),可以取到,當(dāng)執(zhí)行過第二次垃圾回收時,將返回null。弱引用主要用于監(jiān)控對象是否已經(jīng)被垃圾回收器標(biāo)記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標(biāo)記。
大體回答如上,類似文章請移駕:
數(shù)組在內(nèi)存中如何分配
1、簡單的值類型的數(shù)組,每個數(shù)組成員是一個引用(指針),引用到棧上的空間(因?yàn)橹殿愋妥兞康膬?nèi)存分配在棧上)
2、引用類型,類類型的數(shù)組,每個數(shù)組成員仍是一個引用(指針),引用到堆上的空間(因?yàn)轭惖膶?shí)例的內(nèi)存分配在堆上)
用過哪些設(shè)計(jì)模式,手寫一個(除單例)
設(shè)計(jì)模式早有總結(jié),看這里:23種設(shè)計(jì)模式完整總結(jié)
springmvc的核心是什么,請求的流程是怎么處理的,控制反轉(zhuǎn)怎么實(shí)現(xiàn)的
核心:
控制反轉(zhuǎn)和面向切面
請求處理流程:
1、首先用戶發(fā)送請求到前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進(jìn)行處理并把請求委托給它,即以前的控制器的控制邏輯部分;
2、頁面控制器接收到請求后,進(jìn)行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,并進(jìn)行驗(yàn)證,然后將命令對象委托給業(yè)務(wù)對象進(jìn)行處理;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名);
3、前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;
4、前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶。
控制反轉(zhuǎn)如何實(shí)現(xiàn):
我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。
spring中默認(rèn)的bean為單實(shí)例模式,通過bean的class引用反射機(jī)制可以創(chuàng)建這個實(shí)例。
因此,spring框架通過反射替我們創(chuàng)建好了實(shí)例并且替我們維護(hù)他們。
A需要引用B類,spring框架就會通過xml把B實(shí)例的引用傳給了A的成員變量。
大體回答如上,類似文章請移駕:
spring里面的aop的原理是什么
這個有介紹,看這里:Spring的IOC原理
mybatis如何處理結(jié)果集
MyBatis的結(jié)果集是通過反射來實(shí)現(xiàn)的。并不是通過get/set方法。在實(shí)體類中無論是否定義get/set()方法,都是可以接收到的。
如果面試只是考你這個點(diǎn)的話就恭喜了。如果繼續(xù)深問流程,那就需要自己找一些源碼來閱讀了。
java的多態(tài)表現(xiàn)在哪里
主要有兩種表現(xiàn)形式:重載和重寫
重載:
是發(fā)生在同一類中,具有相同的方法名,主要是看參數(shù)的個數(shù),類型,順序不同實(shí)現(xiàn)方法的重載的,返回值的類型可以不同。
重寫:
是發(fā)生在兩個類中(父類和子類),具有相同的方法名,主要看方法中參數(shù),個數(shù),類型必須相同,返回值的類型必須相同。