阿里騰訊面試題目2

阿里一面:

1、介紹一下 java 虛擬機模型

  1. Java 虛擬機運行時數(shù)據(jù)區(qū)
    在 JDK1.8 之前,JVM 運行時數(shù)據(jù)區(qū)分為堆、虛擬機棧、本地方法棧、方法區(qū)、程序計數(shù)器。如下圖所示:
    [圖片上傳失敗...(image-e16198-1589874434522)]
    虛擬機棧:線程私有,隨線程創(chuàng)建而創(chuàng)建。棧里面是一個一個“棧幀”,每個棧幀對應(yīng)一次方法調(diào)用。棧幀中存放了局部變量表(基本數(shù)據(jù)類型變量和對象引用)、操作數(shù)棧、方法出口等信息。當棧調(diào)用深度大于 JVM 所允許的范圍,會拋出 StackOverflowError 的錯誤。
    本地方法棧:線程私有,這部分主要與虛擬機用到的 Native 方法相關(guān),一般情況下,并不需要關(guān)心這部分的內(nèi)容。
    程序計數(shù)器:也叫 PC 寄存器,JVM 支持多個線程同時運行,每個線程都有自己的程序計數(shù)器。倘若當前執(zhí)行的是 JVM 的方法,則該寄存器中保存當前執(zhí)行指令的地址;倘若執(zhí)行的是 native 方法,則 PC 寄存器中為空。(PS:線程執(zhí)行過程中并不都是一口氣執(zhí)行完,有可能在一個 CPU 時鐘周期內(nèi)沒有執(zhí)行完,由于時間片用完了,所以不得不暫停執(zhí)行,當下一次獲得 CPU 資源時,通過程序計數(shù)器就知道該從什么地方開始執(zhí)行)
    方法區(qū):方法區(qū)存放類的信息(包括類的字節(jié)碼,類的結(jié)構(gòu))、常量、靜態(tài)變量等。字符串常量池就是在方法區(qū)中。雖然 Java 虛擬機規(guī)范把方法區(qū)描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的是與 Java 堆區(qū)分開來。很多人都更愿意把方法區(qū)稱為“永久代”(Permanent Generation)。從 jdk1.7 已經(jīng)開始準備“去永久代”的規(guī)劃,jdk1.7 的 HotSpot 中,已經(jīng)把原本放在方法區(qū)中的靜態(tài)變量、字符串常量池等移到堆內(nèi)存中。
    :堆中存放的是數(shù)組(PS:數(shù)組也是對象)和對象。當申請不到空間時會拋出 OutOfMemoryError。
  2. PermGen(永久代)
    “方法區(qū)”是 JVM 的規(guī)范,而“永久代”是方法區(qū)的一種實現(xiàn),并且只有 HotSpot 才有“PermGen space”,而對于其他類型的虛擬機并沒有“PermGen space”。
    在 JDK1.8 中,HotSpot 已經(jīng)沒有“PermGen space”這個區(qū)間了,取而代之是 Metaspace(元空間)
  3. Metaspace(元空間)
    在 JDK1.8 中,永久代已經(jīng)不存在,存儲的類信息、編譯后的代碼數(shù)據(jù)等已經(jīng)移動到了 MetaSpace(元空間)中,元空間并沒有處于堆內(nèi)存上,而是直接占用的本地內(nèi)存(NativeMemory)。
    元空間的本質(zhì)和永久代類似,都是對 JVM 規(guī)范中方法區(qū)的實現(xiàn)。
    不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機中,而是使用本地內(nèi)存。
    元空間的大小僅受本地內(nèi)存限制,可以通過以下參數(shù)來指定元空間大?。?/li>
  • -XX:MetaspaceSize,初始空間大小,達到該值就會觸發(fā)垃圾收集進行類型卸載,同時 GC 會對該值進行調(diào)整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那么在不超過 MaxMetaspaceSize 時,適當提高該值

  • -XX:MaxMetaspaceSize,最大空間,默認是沒有限制的

  • -XX:MinMetaspaceFreeRatio,在 GC 之后,最小的 Metaspace 剩余空間容量的百分比,減少為分配空間所導致的垃圾收集

  • -XX:MaxMetaspaceFreeRatio,在 GC 之后,最大的 Metaspace 剩余空間容量的百分比,減少為釋放空間所導致的垃圾收集

    1. 堆內(nèi)存劃分
      在 JDK1.7 以及其前期的 JDK 版本中,堆內(nèi)存通常被分為三塊區(qū)域:Young Generation、Old Generation、Permanent Generation for VM Matedata
      [圖片上傳失敗...(image-6fbe91-1589874434522)]
      在 JDK1.8 中把存放元數(shù)據(jù)中的永久內(nèi)存從堆內(nèi)存中移到了本地內(nèi)存中,JDK1.8 中 JVM 堆內(nèi)存結(jié)構(gòu)就變成了如下:
      [圖片上傳失敗...(image-80f25e-1589874434522)]

    2. 堆統(tǒng)計信息
      [圖片上傳失敗...(image-9799fa-1589874434522)]

2、對 NIO 文件流和傳統(tǒng)文件流怎么看

題主列舉了 redis 的單線程實現(xiàn)機制,非阻塞文件流,也不知道是否達到題目上,具體可以參考一下
知乎有一篇文章寫得不錯:https://www.zhihu.com/question/337609338/answer/775135962

3、列舉一個你設(shè)計以及參與度最高的項目經(jīng)驗

題主有點懵,談到設(shè)計還是有點虛的,隨便談了一點參與過的數(shù)據(jù)可視化項目的設(shè)計

4、Spring AOP IOC 的看法,鉤子函數(shù)是什么

AOP 原理:
https://blog.csdn.net/u010452388/article/details/80868392
兩種代理方式:jdk 代理,cglib 代理
AOP 思想: 基于代理思想,對原來目標對象,創(chuàng)建代理對象,在不修改原對象代碼情況下,通過代理對象,調(diào)用增強功能的代碼,從而對原有業(yè)務(wù)方法進行增強 !
IOC:Ioc—Inversion of Control,即“控制反轉(zhuǎn)”,不是什么技術(shù),而是一種設(shè)計思想。在 Java 開發(fā)中,Ioc 意味著將你設(shè)計好的對象交給容器控制,而不是傳統(tǒng)的在你的對象內(nèi)部直接控制。
https://www.cnblogs.com/xdp-gacl/p/4249939.html
鉤子函數(shù):spring 官方預留的接口,比如 Aware 接口族
Spring 中提供了各種 Aware 接口,方便從上下文中獲取當前的運行環(huán)境,比較常見的幾個子接口有:
BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware 等,這些 Aware 的作用都可以從命名得知,并且其使用也是十分簡單。

5、Spring bean 生命周期

https://www.cnblogs.com/zrtqsk/p/3735273.html
https://www.cnblogs.com/demo12138/p/12512947.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容