高階程式設計師(JAVA)面試必知必會二(問題+答案)
1.業務介紹,場景描述,負責模組
2.資料庫隔離級別,分別會避免什麼樣的錯誤,預設隔離級別。
read_uncommited,read_commited,repeatable_read,serializable_read,髒讀,可重複讀,幻讀
3.IOC的原理
物件例項化的工作從開發者轉移到容器。
applicationContext常用介面哪些,都有什麼作用。
- MessageSource———為應用提供國際化訪問功能
- ResourceLoader———提供資源(如URL和檔案系統)的訪問支援
- ApplicationEventPublisher———引入事件機制,包括啟動事件、關閉事件等,讓容器在上下文中提供了對應用事件的支
-
ApplicationContext的主要實現類有
- ClassPathXmlApplicationContext(從類路徑載入IoC配置檔案);
- FileSystemXmlApplicationContext(從檔案系統載入IoC配置檔案)。
4.AOP原理
動態代理。cglib和jdk的原理。
JDK動態代理只能對實現了介面的類生成代理,而不能針對類
CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法(繼承)
5.happenBefore偏序規則
6.多執行緒相關
volatile定義與功能。
wait和notify notifyall實踐
被wait的執行緒,想要繼續執行的話,它必須滿足2個條件:
- 由其他執行緒notify或notifyAll了,並且當前執行緒被通知到了
- 經過和其他執行緒進行鎖競爭,成功獲取到鎖了
2個條件,缺一不可。其實在實現層面,notify和notifyAll都達到相同的效果,都只會有一個執行緒繼續執行。但notifyAll免去了,執行緒執行完了通知其他執行緒的必要,因為已經通知過了。什麼時候用notify,什麼時候使用notifyAll,這就得看實際的情況了。
7.爬蟲框架原理
8.垃圾回收
垃圾收集器,作用,垃圾回收演算法,新生代suvivor和eden佔比調節引數
1)-XX:NewSize和-XX:MaxNewSize
用於設定年輕代的大小,建議設為整個堆大小的1/3或者1/4,兩個值設為一樣大。
2)-XX:SurvivorRatio
用於設定Eden和其中一個Survivor的比值,這個值也比較重要。
3)-XX:+PrintTenuringDistribution
這個引數用於顯示每次Minor GC時Survivor區中各個年齡段的物件的大小。
4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold
用於設定晉升到老年代的物件年齡的最小值和最大值,每個物件在堅持過一次Minor GC之後,年齡就加1。
G1和CMS的區別
9.IO相關
突然中斷會怎樣。
10.redis
常用應用場景
11.訊息佇列
拉模式:
點對點消費,如果沒有消費者在監聽佇列,訊息將保留在佇列中,直至消費者連線到佇列,在這種模型中,訊息不是自動推動給消費者的,而是要由消費者從佇列中請求活動(拉模式)。 優點: 1.保證每條訊息都被接收。 2.訊息不會丟失。
推模式
訊息會自動廣播,訊息消費者無需主動請求或輪詢主題的方法來獲得新訊息。 對比: 1.不保證每條訊息都會被消費, 2.釋出訊息時,只有正在監聽該topic的能夠接收,如果沒人監聽,則會訊息丟失。
加大點難度:
Dubble通訊機制,拋開註冊中心,如果呼叫不到,可能會出現什麼問題,如何定位
負載均衡策略
dubbo負載均衡策略:
在叢集負載均衡時,Dubbo提供了多種均衡策略,預設為random隨機呼叫。
RandomLoadBalance
隨機,按權重設定隨機概率。
在一個截面上碰撞的概率高,但呼叫量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。
RoundRobin LoadBalance
輪循,按公約後的權重設定輪循比率。
存在慢的提供者累積請求問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
LeastActive LoadBalance
最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。
使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。
ConsistentHashLoadBalance
一致性Hash,相同引數的請求總是發到同一提供者。
當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。
鎖降級:
鎖降級指的是寫鎖降級成為讀鎖。鎖降級是指把持住當前擁有的寫鎖的同時,再獲取到讀鎖,隨後釋放寫鎖的過程。
可重入鎖:
熔斷機制
資料庫相關,b樹b+樹還有雜湊索引有啥區別
Rehash啥原理
Ioc都用了哪些設計模式,怎麼用的
雙親委派機制碰見重複類怎麼辦
能不能自己寫個類叫java.lang.System?
答案:通常不可以,但可以採取另類方法達到這個需求。
解釋:為了不讓我們寫System類,類載入採用委託機制,這樣可以保證爸爸們優先,爸爸們能找到的類,兒子就沒有機會載入。而System類是Bootstrap載入器載入的,就算自己重寫,也總是使用Java系統提供的System,自己寫的System類根本沒有機會得到載入。
鎖降級,鎖升級相關
平常都有用到哪些jdk自帶的工具,都用來做什麼了
如果出現outOfMemery,可以從哪些地方來定位這個問題
如果出現stackoverFlow,可以從哪些地方來定位問題
其實上面兩個問題都可以從原理方面來展開:
java虛擬機器中,五個區得知道吧,程式計數器,虛擬機器棧,本地方法棧,堆,方法區,除了程式計數器,其他區都可能發生OutOfMemory。比如:
虛擬機器棧擴充套件時無法申請到足夠的記憶體時將會跑出OOM異常。
本地方法棧和虛擬機器棧差不多,所以也會出現同樣的問題。
堆的話主要是存放物件的,如果GC後,仍然沒有足夠的記憶體分配,也不能擴充套件,將會丟擲OutOfMemoryError:Java Heap Space異常,如果不是真的有邏輯問題(莫名建立了大量的物件),那可以嘗試下調整下虛擬機器的預設記憶體空間大小,vm arguments框裡輸入一些簡單的引數配置,
各個引數的含義為:
-Xms
,表示程式啟動時,JVM 堆的初始化最小尺寸引數;-Xmx
,表示程式啟動時,JVM 堆的初始化最大尺寸引數;-XX:PermSize
,表示程式啟動時,JVM 方法區的初始化最小尺寸引數;-XX:MaxPermSize
,表示程式啟動時,JVM 方法區的初始化最大尺寸引數。
方法區的話,如果它使用的記憶體超過它允許的大小時,就會丟擲OutOfMemory:PermGen Space異常。permGen代表的是permanent generation,永久代的意思。PermGen 空間的使用量, 與JVM載入的 class 數量有很大關係,隨著生成的class越來越多,將會佔滿Permgen空間
棧溢位的相關參考這個
一、區域性陣列過大。當函式內部的陣列過大時,有可能導致堆疊溢位。
二、遞迴呼叫層次太多。遞迴函式在執行時會執行壓棧操作,當壓棧次數太多時,也會導致堆疊溢位。
三、指標或陣列越界。這種情況最常見,例如進行字串拷貝,或處理使用者輸入等等。
解決這類問題的辦法有兩個,
一是增大棧空間,二是改用動態分配,使用堆(heap)而不是棧(stack)。
B樹和hash的應用場景是什麼樣子的
SpringBoot瞭解
資料庫的有什麼瞭解
limit優化方案
CGlib比JDK的效能對比??
一般情況下還是選擇jdk代理,jdk代理比較快。
(1)使用CGLib實現動態代理,CGLib底層採用ASM位元組碼生成框架,使用位元組碼技術生成代理類,比使用Java反射效率要高。唯一需要注意的是,CGLib不能對宣告為final的方法進行代理,因為CGLib原理是動態生成被代理類的子類。
(2)在對JDK動態代理與CGlib動態代理的程式碼實驗中看,1W次執行下,JDK7及8的動態代理效能比CGlib要好20%左右。
最新的版本mysql多少,有什麼新特性?
最新的版本Spring多少,有什麼新特性?
最新的版本jdk多少,有什麼新特性?
date -> LocalDate(例如2018-09-18)
time -> LocalTime(例如12:20:25.000000040)
timestamp -> LocalDateTime(例如2018-09-18T09:35:47.335)
單點登陸系統如何實現?
.說一下TreeMap的實現原理?紅黑樹的性質?紅黑樹遍歷方式有哪些?如果key衝突如何解決?setColor()方法在什麼時候用?什麼時候會進行旋轉和顏色轉換?
手寫RPC
bean的生命週期
Dubbo超時重試;Dubbo超時時間設定
Dubbo超時和重連配置示例
<!-- 服務呼叫超時設定為6秒,超時不重試-->
<dubbo:service interface="com.provider.service.DemoService" ref="demoService" retries="0" timeout="5000"/>
Dubbo消費者端統一的超時和重連配置
<!--統一的消費者配置-->
<dubbo:consumer timeout="30000" retries="0" version="1.0.0"/>
dubbo在呼叫服務不成功時,預設會重試2次。
Dubbo的路由機制,會把超時的請求路由到其他機器上,而不是本機嘗試,所以 dubbo的重試機器也能一定程度的保證服務的質量。
但是如果不合理的配置重試次數,當失敗時會進行重試多次,這樣在某個時間點出現效能問題,呼叫方再連續重複呼叫,
系統請求變為正常值的retries倍,系統壓力會大增,容易引起服務雪崩,需要根據業務情況規劃好如何進行異常處理,何時進行重試。
如何保障請求執行順序
為了簡單輕量級的可以考慮使用 Redis. 藉助 Redis 的list結構, Producer 呼叫 Redis 的 lpush 往特定key裡新增訊息, Consumer 呼叫 brpop 去不斷監聽該key.
如果需要實現複雜功能的, 那麼可以考慮使用 RabbitMQ 或 ActiveMQ 等之類的專門的訊息佇列.
執行某操作,前50次成功,第51次失敗
a全部回滾
父類方法加事務PROPAGATION_REQUIRED
b前50次提交第51次拋異常,ab場景分別如何設定Spring(傳播性)
父類方法加事務PROPAGATION_REQUIRED ,子類方法加事務PROPAGATION_REQUIRES_NEW
Zookeeper有哪些用
資料庫垂直和水平拆分
案例:
以mysql為例,簡單購物系統暫設涉及如下表:
1. 產品表(資料量10w,穩定)
2. 訂單表(資料量200w,且有增長趨勢)
3. 使用者表 (資料量100w,且有增長趨勢)
垂直拆分:
解決問題: 表與表之間的io競爭
不解決問題: 單表中資料量增長出現的壓力
方案:
- 把產品表和使用者表放到一個server上
- 訂單表單獨放到一個server上
水平拆分:
解決問題: 單表中資料量增長出現的壓力
不解決問題: 表與表之間的io爭奪
方案:
- 使用者表通過性別拆分為男使用者表和女使用者表;
- 訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單;
- 產品表未完成訂單放一個server上;
- 已完成訂單表盒男使用者表放一個server上;
- 根據新使用者和老使用者,因為新使用者相應的活躍度高;
MyBatis如何分頁;如何設定快取;MySQL分頁
熟悉IO麼?與NIO的區別,阻塞與非阻塞的區別
阻塞隊列了解多少
介面如何處理重複請求?
設計一個對外服務的介面實現類,在1,2,3這三個主機(對應不同IP)上實現負載均衡和順序輪詢機制(考慮併發)
jvm,jre以及jdk三者之間的關係?
總的來說JDK是用於java程式的開發,而jre則是隻能執行class而沒有編譯的功能。
JDK是提供給Java開發人員使用的,其中包含了java的開發工具,也包括了JRE。所以安裝了JDK,就不用在單獨安裝JRE了。 其中的開發工具包括編譯工具(javac.exe)打包工具(jar.exe)等
JVM可以理解為是一個虛擬出來的計算機,具備著計算機的基本運算方式,它主要負責將java程式生成的位元組碼檔案解釋成具體系統平臺上的機器指令。讓具體平臺如window執行這些Java程式。
三者之間關係
JDK 包含JRE,JRE包含JVM。
我們開發的實際情況是:我們利用JDK(呼叫JAVA API)開發了屬於我們自己的JAVA程式後,通過JDK中的編譯程式(javac)將我們的文字java檔案編譯成JAVA位元組碼,在JRE上執行這些JAVA位元組碼,JVM解析這些位元組碼,對映到CPU指令集或OS的系統呼叫。