阿里外包電話面試題


Spring

  • 並發處理?
    • 在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。
  • 優缺點?
  • bean生命周期?
  • 常用注解?
  • 自動裝載的方式?
    • 常規方式

      • 通過構造器(配置元信息:XML、Java 注解和 Java API )

      • 通過靜態工廠方法(配置元信息:XML 和 Java API )

      • 通過 Bean 工廠方法(配置元信息:XML和 Java API )

      • 通過 FactoryBean(配置元信息:XML、Java 注解和 Java API )

    • 特殊方式

      • 通過 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )

        • getObjectToExpose()

          • ServiceFactoryBean 返回第一個ServiceLoader,迭代器

          • ServiceListFactoryBean 返回所有ServiceLoader,list

          • ServiceLoaderFactoryBean 返回一個ServiceLoader

      • 通過 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)

      • 通過 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

JVM

  • 啟動參數?
    • xms
      • 堆的最小值
    • xmx
      • 堆的最大值
    • xmn
      • 新生代的大小
    • -XX:NewSize
      • 新生代最小值
    • -XX:MaxNewSize
      • 新生代最小值
  • 堆內存分配策略
    • 對象優先在Eden 區分配
      • 當 Eden 區沒有足夠空間分配時,虛擬機將發起一次 Minor GC。
    • 大對象直接進入老年代
      • 最典型的大對象是那種很長的字符串以及數組。
      • 目的:1.避免大量內存復制,2.避免提前進行垃圾回收。
      • 參數PretenureSizeThreshold=3m,超過多少大小的對象直接進入老年代
    • 長期存活對象進入老年代
      • 對象在Eden出生后經歷Minor GC后仍存活,且能被survivor容納,將移動到survivor中,並設置對象年齡為1, 對象在 Survivor 區中每熬過一次 Minor GC,年齡就增加 1,當它的年齡增加到一定程度(默認為 15)_時,就會被晉升到老年代中。
    • 對象年齡動態判定
      • 加單說就是,年齡大小滿足條件就直接進老年代
    • 空間分配擔保
  • jvm中堆棧的區別(問的很細致了,因為從os層來講,本質上都是內存)?
    • 棧是線程私有,先進后出結構,包括虛擬機棧,本地方法棧,程序計數器
      • (面試官:此處應有刨根問底。我:我掙扎一下。。)
      • 說一下三者分別是干啥用的?
        • 虛擬機棧(確定當前線程執行到了哪個方法,包括方法內的一些參數:包括局部變量表、操作數棧、動態鏈接、返回地址)
          • 執行java方法用的
          • 每個時刻正在執行的當前方法就是虛擬機棧頂的棧楨
          • 方法的執行就對應着棧幀在虛擬機棧中入棧和出棧的過程。
          • tips:區分異常
            • 線程請求的棧深度大於虛擬機所允許的深度:StackOverflowError
            • JVM 動態擴展時無法申請到足夠的內存時:OutOfMemoryError
        • 本地方法棧
          • 用來執行c++方法的(native方法)
          • native 方法調用 JNI 到了底層的 C/C++
          • 什么是JNI?
            • JNI是Java Native Interface的縮寫,通過使用 Java本地接口書寫程序,可以確保代碼在不同的平台上方便移植。
            • 允許Java代碼和其他語言寫的代碼進行交互
            • 使用java與本地已編譯的代碼交互,通常會喪失平台可移植性。
            • 有時也可以接受,比如使用一些舊的庫,與硬件、操作系統進行交互,或者為了提高程序的性能。
        • 程序計數器
          • 確定當前字節碼(java)執行到哪一行,如果是native則為空
          • 唯一不會OOM的區域
  • 垃圾回收是回收的哪塊內存?
    • 當時只回答了堆,現在再思考一下,應該是堆和棧,理由如下:new對象時對象在堆里,但是對象的引用還在棧里,所以,在堆中的對象被回收時,那棧的引用是不是也該回收掉?
    • 回收的方式(當時好像回答成了垃圾回收器?明明知道的。害😳)?
      • Minor GC
        • 新生代發生,較頻繁,速度快
        • Eden 區空間不足/空間分配擔保失敗
      • Full GC
        • 主要在老年代(新生代也會有),較少,速度慢
        • 調用 System.gc()/老年代區域空間不足/空間分配擔保失敗
      • 空間分配擔保
        • 簡單來說,就是看看有沒有能裝得下對象的空間
    • 自問一哈:內存分配比例?
      • 堆分為新生代1/3老年代2/3
      • 新生代分為Eden、Survivor(from)、Survivor(to),配比默認811,可修改
        • 設置兩個 Survivor 區是為了解決碎片化的問題(`復制回收算法)
    • 如何判斷對象可回收?
      • 引用計數法
        • 傻乎乎的,當對象增加一個引用時計數器加 1,引用失效時計數器減 1。引用計數為 0 的對象可被回收。py在用
        • 實現簡單,但是麻煩在相互引用
      • 可達性分析
        • 這個算法的基本思路就是通過一系列的稱為“GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為 引用鏈(Reference Chain),當一個對象沒有任何引用鏈相連時,則證明此對象是該回收的。

並發

  • 說一下用過哪些線程安全的類
    • ConcurrentHashMap
      • 原理?
        • 分段鎖
          • 為什么稱為分段鎖?
          • 怎么分段的?
      • CAS
        • 原理
        • ABA
          • 怎么解決的?

  • ReentrantLock內部機制
    • AQS
      • AQS內部原理展開聊一下
  • synchronized
    • 原理
    • 鎖升級有了解過嗎

多線程使用方式(應該是我理解錯了,直接跳到線程池了,應該是想讓我說實現多線程的方式,兩種Runnable、Thread)

  • 線程池
    • 核心參數
    • 有界隊列與無界隊列的區別
    • 拒絕策略
    • submit與execute的區別,哪個有返回值
  • happen-before原則

Redis

  • 為什么調用快?
    • 單線程,采用IO多路復用
      • 什么是IO多路復用
  • select,poll,epoll區別?
  • 分區?
  • 持久化方式?
    • RDB和xx
  • 分布式鎖?
    • setNx
  • 有哪些數據結構,怎么用的
    • 5種

Mysql

  • 有哪些存儲引擎
    • 分別用了什么索引
      • 原理結構是什么
  • 如何避免回表查詢
  • 索引失效原因
  • 如何知道索引是否生效
    • 查看執行計划
      • type字段都有哪些值
        • 分別代表什么意思
  • mysql死鎖有遇到過嗎
    • 有遇到過 table metadata lock
      • show processlist

必殺技:看過哪些技術書籍?(不是記得特別牢固的就別給自己挖坑了。。。說了半年內看過TCP協議,直接就是一頓打。。上來就是問:Tcp如何保證消息傳輸的可靠性?)

屬於定級性面試,整體面了40分鍾左右,還在等結果,不過估計是掛了。
后續整理,歡迎關注。
1024快樂,繼續加油 😃


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM