1. 程式人生 > >高階程式設計師(JAVA)面試必知必會二(問題+答案)

高階程式設計師(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個條件:

  1. 由其他執行緒notify或notifyAll了,並且當前執行緒被通知到了
  2. 經過和其他執行緒進行鎖競爭,成功獲取到鎖了

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競爭 
  不解決問題: 單表中資料量增長出現的壓力 
  方案:

  1. 把產品表和使用者表放到一個server上
  2. 訂單表單獨放到一個server上

水平拆分: 
  解決問題: 單表中資料量增長出現的壓力 
  不解決問題: 表與表之間的io爭奪 
  方案:

  1. 使用者表通過性別拆分為男使用者表和女使用者表;   
  2. 訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單;  
  3. 產品表未完成訂單放一個server上;   
  4. 已完成訂單表盒男使用者表放一個server上;   
  5. 根據新使用者和老使用者,因為新使用者相應的活躍度高;

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的系統呼叫。

AQS原理?

Dubbo負載均衡演算法

Zookeeper底層原理

mybatis底層原理

Mybatis動態SQL底層工作原理

bean的生命週期

鎖優化策略

CAS原理

BIO NIO AIO的區別

ELK

序列化與反序列化框架

REDIS常見應用場景