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
- 新生代最小值
- xms
- 堆內存分配策略
- 對象優先在Eden 區分配
- 當 Eden 區沒有足夠空間分配時,虛擬機將發起一次 Minor GC。
- 大對象直接進入老年代
- 最典型的大對象是那種很長的字符串以及數組。
- 目的:1.避免大量內存復制,2.避免提前進行垃圾回收。
- 參數PretenureSizeThreshold=3m,超過多少大小的對象直接進入老年代
- 長期存活對象進入老年代
- 對象在Eden出生后經歷Minor GC后仍存活,且能被survivor容納,將移動到survivor中,並設置對象年齡為1, 對象在 Survivor 區中每熬過一次 Minor GC,年齡就增加 1,當它的年齡增加到一定程度(默認為 15)_時,就會被晉升到老年代中。
- 對象年齡動態判定
- 加單說就是,年齡大小滿足條件就直接進老年代
- 空間分配擔保
- 對象優先在Eden 區分配
- 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()/老年代區域空間不足/空間分配擔保失敗
- 空間分配擔保
- 簡單來說,就是看看有沒有能裝得下對象的空間
- Minor GC
- 自問一哈:內存分配比例?
- 堆分為
新生代1/3
和老年代2/3
- 新生代分為
Eden、Survivor(from)、Survivor(to)
,配比默認811
,可修改- 設置兩個 Survivor 區是為了解決
碎片化
的問題(`復制回收算法)
- 設置兩個 Survivor 區是為了解決
- 堆分為
- 如何判斷對象可回收?
- 引用計數法
- 傻乎乎的,當對象增加一個引用時計數器加 1,引用失效時計數器減 1。引用計數為 0 的對象可被回收。py在用
- 實現簡單,但是麻煩在相互引用
- 可達性分析
- 這個算法的基本思路就是通過一系列的稱為
“GC Roots”的對象作為起始點
,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain)
,當一個對象沒有任何引用鏈相連時,則證明此對象是該回收的。
- 這個算法的基本思路就是通過一系列的稱為
- 引用計數法
並發
- 說一下用過哪些線程安全的類
- ConcurrentHashMap
- 原理?
- 分段鎖
- 為什么稱為分段鎖?
- 怎么分段的?
- 分段鎖
- CAS
- 原理
- ABA
- 怎么解決的?
- 原理?
- ConcurrentHashMap
鎖
- ReentrantLock內部機制
- AQS
- AQS內部原理展開聊一下
- AQS
- synchronized
- 原理
- 鎖升級有了解過嗎
多線程使用方式(應該是我理解錯了,直接跳到線程池了,應該是想讓我說實現多線程的方式,兩種Runnable、Thread)
- 線程池
- 核心參數
- 有界隊列與無界隊列的區別
- 拒絕策略
- submit與execute的區別,哪個有返回值
- happen-before原則
Redis
- 為什么調用快?
- 單線程,采用IO多路復用
- 什么是IO多路復用
- 單線程,采用IO多路復用
- select,poll,epoll區別?
- 分區?
- 持久化方式?
- RDB和xx
- 分布式鎖?
- setNx
- 有哪些數據結構,怎么用的
- 5種
Mysql
- 有哪些存儲引擎
- 分別用了什么索引
- 原理結構是什么
- 分別用了什么索引
- 如何避免回表查詢
- 索引失效原因
- 如何知道索引是否生效
- 查看執行計划
- type字段都有哪些值
- 分別代表什么意思
- type字段都有哪些值
- 查看執行計划
- mysql死鎖有遇到過嗎
- 有遇到過 table metadata lock
- show processlist
- 有遇到過 table metadata lock
必殺技:看過哪些技術書籍?(不是記得特別牢固的就別給自己挖坑了。。。說了半年內看過TCP協議,直接就是一頓打。。上來就是問:Tcp如何保證消息傳輸的可靠性?)
屬於定級性面試,整體面了40分鍾左右,還在等結果,不過估計是掛了。
后續整理,歡迎關注。
1024快樂,繼續加油 😃