2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

程式設計師追風發表於2019-11-06

前言

2019年還有不到2個月的時間就結束了,這一你,你收穫了多少?

前段時間一直有粉絲問我,有沒有今年一些大廠Java面試題總結?最新抽時間整理了一些,分享給大家,大家一起共享學習!
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

一、效能調優系列

1.Tomcat效能調優

JVM引數調優: -Xms<size> 表示JVM初始化堆的大小,一Xmx<size>表示JVM堆的最大值。這兩個值的大小一般根據需要進行設定。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此- -般建議堆的最大值設定為可用記憶體的最大值的80%。在catalina.bat中,設定JAVA _0PTS='-Xms256m-Xmx512m',表示初始化記憶體為256MB,可以使用的最大記憶體512MB。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

2.JVM效能調優

Java類載入過程 

Java類載入需要經歷一下7個過程: 

1.載入 

載入是類載入的第一個過程,在這個階段,將完成一下三件事情
(1)通過一個類的全限定名獲取該類的二進位制流。
(2)將該二進位制流中的靜態儲存結構轉化為方法去執行時資料結構。
(3)在記憶體中生成該類的Class物件,作為該類的資料訪問入口。

2.驗證
驗證的目的是為了確保Class檔案的位元組流中的資訊不回危害到虛擬機器.在該階段主要完成以下四鍾驗證:
(1)檔案格式驗證:驗證位元組流是否符合Class檔案的規範,如主次版本號是否在當前虛擬機器範圍內,常量池中的常量是否有不被支援的型別.
(2)後設資料驗證:對位元組碼描述的資訊進行語義分析,如這個類是否有父類,是否整合了不被繼承的類等。
(3)位元組碼驗證:是整個驗證過程中最複雜的一個階段,通過驗證資料流和控制流的分析,確定程式語義是否正確,主要針對方法體的驗證。如:方法中的型別轉換是否正確,跳轉指令是否正確等。
(4)符號引用驗證:這個動作在後面的解析過程中發生,主要是為了確保解析動作能正確執行。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

3.MySQL效能調優

複製基本原理流程
1. 主:binlog 執行緒——記錄下所有改變了資料庫資料的語句,放進 master 上的 binlog 中;
2. 從:io 執行緒——在使用 start slave 之後,負責從 master 上拉取 binlog 內容,放進 自己的 relay log 中;
3. 從:sql 執行執行緒——執行 relay log 中的語句;

MySQL 複製的執行緒有幾個及之間的關聯
MySQL 的複製是基於如下 3 個執行緒的互動( 多執行緒複製裡面應該是 4 類執行緒):
1. Master 上面的 binlog dump 執行緒,該執行緒負責將 master 的 binlogevent 傳到 slave;
2. Slave 上面的 IO 執行緒,該執行緒負責接收 Master 傳過來的 binlog,並寫入relay log;
3. Slave 上面的 SQL 執行緒,該執行緒負責讀取 relay log 並執行;
4. 如果是多執行緒複製,無論是 5.6 庫級別的假多執行緒還是 MariaDB 或者 5.7的真正的多執行緒複製, SQL 執行緒只做 coordinator,只負責把 relay log 中的binlog 讀出來然後交給 worker 執行緒, woker 執行緒負責具體 binlog event 的執行;
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

二、微服務系列

1.Spring Cloud面試

什麼是 Spring Cloud?

Spring cloud 流應用程式啟動器是基於 Spring Boot 的 Spring 整合應用程式,提供與外部系統的整合。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限資料處理的應用程式。

使用 Spring Cloud 有什麼優勢?
使用 Spring Boot 開發分散式微服務時,我們面臨以下問題
1.與分散式系統相關的複雜性-這種開銷包括網路問題,延遲開銷,頻寬問題,安全問題。
2.服務發現-服務發現工具管理群集中的流程和服務如何查詢和互相交談。它涉及一個服務目錄,在該
目錄中註冊服務,然後能夠查詢並連線到該目錄中的服務。
3. 冗餘-分散式系統中的冗餘問題。
4. 負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機叢集,網路鏈路,中央
處理單元,或磁碟驅動器的分佈。
5.效能-問題 由於各種運營開銷導致的效能問題。
6. 部署複雜性-Devops 技能的要求。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

2.spring boot面試

什麼是 Spring Boot?
多年來,隨著新功能的增加,spring 變得越來越複雜。頁面,我們就會看到可以在我們的應用程式中使用的所有 Spring 專案的不同功能。如果必須啟動一個新的 Spring 專案,我們必須新增構建路徑或新增 Maven 依賴關係,配置應用程式伺服器,新增 spring 配置。因此,開始一個新的 spring 專案需要很多努力,因為我們現在必須從頭開始做所有事情。Spring Boot 是解決這個問題的方法。Spring Boot 已經建立在現有 spring 框架之上。使用spring 啟動,我們避免了之前我們必須做的所有樣板程式碼和配置。因此,Spring Boot 可以幫助我們以最少的工作量,更加健壯地使用現有的 Spring 功能。

Spring Boot 有哪些優點?
Spring Boot 的優點有:
1.減少開發,測試時間和努力。
2.使用 JavaConfig 有助於避免使用 XML。
3.避免大量的 Maven 匯入和各種版本衝突。
4.提供意見發展方法。
5.通過提供預設值快速開始開發。
6.沒有單獨的 Web 伺服器需要。這意味著你不再需要啟動 Tomcat,Glassfish 或其他任何東
西。
7.需要更少的配置 因為沒有 web.xml 檔案。只需新增用@ Configuration 註釋的類,然後新增
用@Bean 註釋的方法,Spring 將自動載入物件並像以前一樣對其進行管理。您甚至可以將
@Autowired 新增到 bean 方法中,以使 Spring 自動裝入需要的依賴關係中。
8.基於環境的配置 使用這些屬性,您可以將您正在使用的環境傳遞到應用程式:-
Dspring.profiles.active = {enviornment}。在載入主應用程式屬性檔案後,Spring 將在
(application{environment} .properties)中載入後續的應用程式屬性檔案。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

3.Dubbo面試

Dubbo 支援哪些協議,每種協議的應用場景,優缺點?
1.dubbo : 單一長連線和 NIO 非同步通訊,適合大併發小資料量的服務呼叫,以及消費者遠大於提供者。傳輸協議 TCP,非同步,Hessian 序列化;
2. rmi : 採用 JDK 標準的 rmi 協議實現,傳輸引數和返回引數物件需要實現Serializable 介面,使用 java 標準序列化機制,使用阻塞式短連線,傳輸資料包大小混合,消費者和提供者個數差不多,可傳檔案,傳輸協議 TCP。多個短連線,TCP 協議傳輸,同步傳輸,適用常規的遠端服務呼叫和 rmi 互操作。在依賴低版本的 Common-Collections 包,java 序列化存在安全漏洞;
3. webservice : 基於 WebService 的遠端呼叫協議,整合 CXF 實現,提供和原生 WebService 的互操作。多個短連線,基於 HTTP 傳輸,同步傳輸,適用系統整合和跨語言呼叫;
4. http : 基於 Http 表單提交的遠端呼叫協議,使用 Spring 的 HttpInvoke 實現。多個短連線,傳輸協議 HTTP,傳入引數大小混合,提供者個數多於消費者,需要給應用程式和瀏覽器 JS 呼叫;
5. hessian : 整合 Hessian 服務,基於 HTTP 通訊,採用 Servlet 暴露服務,Dubbo 內嵌 Jetty 作為伺服器時預設實現,提供與 Hession 服務互操作。多個短連線,同步 HTTP 傳輸,Hessian 序列化,傳入引數較大,提供者大於消費者,提供者壓力較大,可傳檔案;
6. memcache : 基於 memcached 實現的 RPC 協議
7. redis : 基於 redis 實現的 RPC 協議
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

三、併發程式設計系列

1.Synchronized原理

synchronized和ReentrantLock的區別?
synchronized是和if、else、for、while一樣的關鍵字,ReentrantLock是類,這是二者的本質區別。既然ReentrantLock是類,那麼它就提供了比synchronized更多更靈活的特性,可以被繼承、可以有方法、可以有各種各樣的類變數,ReentrantLock比synchronized的擴充套件性體現在幾點上:
(1)ReentrantLock可以對獲取鎖的等待時間進行設定,這樣就避免了死鎖
(2)ReentrantLock可以獲取各種鎖的資訊
(3)ReentrantLock可以靈活地實現多路通知
另外,二者的鎖機制其實也是不一樣的。ReentrantLock底層呼叫的是Unsafe的park方法加鎖,synchronized操作的應該是物件頭中mark word,這點我不能確定。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

2.AQS框架

什麼是AQS
AQS是AbustactQueuedSynchronizer的簡稱,它是一個Java提高的底層同步工具類,用一個int型別的變數表示同步狀態,並提供了一系列的CAS操作來管理這個同步狀態。
AQS是一個用來構建鎖和同步器的框架,使用AQS能簡單且高效地構造出應用廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基於AQS的。
AQS支援兩種同步方式:
1.獨佔式
2.共享式
這樣方便使用者實現不同型別的同步元件,獨佔式如ReentrantLock,共享式如Semaphore,CountDownLatch,組合式的如ReentrantReadWriteLock。總之,AQS為使用提供了底層支撐,如何組裝實現,使用者可以自由發揮。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

3.Java執行緒池

如果你提交任務時,執行緒池佇列已滿,這時會發生什麼?
這裡區分一下:
如果使用的是無界佇列LinkedBlockingQueue,也就是無界佇列的話,沒關係,繼續新增任務到阻塞佇列中等待執行,因為LinkedBlockingQueue可以近乎認為是一個無窮大的佇列,可以無限存放任務 如果使用的是有界佇列比如ArrayBlockingQueue,任務首先會被新增到ArrayBlockingQueue中,ArrayBlockingQueue滿了,會根據maximumPoolSize的值增加執行緒數量,如果增加了執行緒數量還是處理不過來,ArrayBlockingQueue繼續滿,那麼則會使用拒絕策略RejectedExecutionHandler處理滿了的任務,預設是AbortPolicy
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

四、開源框架系列

1.spring面試

什麼是 Spring 框架,Spring 框架有哪些主要模組
Spring 框架是一個為 Java 應用程式開發提供綜合、廣泛的基礎性支援的 Java 平臺。
Spring 幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。
Spring 框架本身也是按照設計模式精心打造的,這使得我們可以在開發環境中安心地整合
Spring 框架,不必擔心 Spring 是如何在後臺工作的。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

2.springMVC面試

什麼是 SpringMvc?
SpringMvc 是 spring 的一個模組,基於 MVC 的一個框架,無需中間整合層來整合。

Spring MVC 的優點:
1.它是基於元件技術的.全部的應用物件,無論控制器和檢視,還是業務物件之類的都是 java
元件.並且和 Spring 提供的其他基礎結構緊密整合.
2.不依賴於 Servlet API(目標雖是如此,但是在實現的時候確實是依賴於 Servlet 的)
3.可以任意使用各種檢視技術,而不僅僅侷限於 JSP
4.支援各種請求資源的對映策略
5.它應是易於擴充套件的
SpringMVC 工作原理?
1..客戶端傳送請求到 DispatcherServlet
2.DispatcherServlet 查詢 handlerMapping 找到處理請求的 Controller
3.Controller 呼叫業務邏輯後,返回 ModelAndView
4.DispatcherServlet 查詢 ModelAndView,找到指定檢視
5.檢視將結果返回到客戶端
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

3.MyBatis面試

談談你對 MyBatis 的理解?
1. Mybatis是一個半ORM(物件關係對映)框架,它內部封裝了 JDBC,開發時只需要關注 SQL 語句本身,不需要花費精力去處理載入驅動、建立連線、建立 Statement 等繁雜的過程。程式設計師直接編寫原生態 SQL,可以嚴格控制 SQL 執行效能,靈活度高。
 2. MyBatis 可以使用 XML 或註解來配置和對映原生資訊,將 POJO 對映成資料庫中的記錄,避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。
3. 通過 XML 檔案或註解的方式將要執行的各種 Statement 配置起來,並通過 Java 物件和 Statement 中 SQL 的動態引數進行對映生成最終執行的 SQL 語句,最後由 MyBatis 框架執行 SQL並將結果對映為 Java 物件並返回。(從執行 SQL到返回 Result 的過程)。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

五、分散式專題

1.分散式限流面試

談下你對 Zookeeper 的認識?
ZooKeeper 是一個分散式的,開放原始碼的分散式應用程式協調服務。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。
ZooKeeper 的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。

Zookeeper 都有哪些功能?
1. 叢集管理:監控節點存活狀態、執行請求等;
2. 主節點選舉:主節點掛掉了之後可以從備用的節點開始新一輪選主,主節點選舉說的就是這個選舉的過程,使用 Zookeeper 可以協助完成這個過程;
3. 分散式鎖:Zookeeper 提供兩種鎖:獨佔鎖、共享鎖。獨佔鎖即一次只能有一個執行緒使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線執行緒同時讀同一個資源,如果要使用寫鎖也只能有一個執行緒使用。Zookeeper 可以對分散式鎖進行控制。
4. 命名服務:在分散式系統中,通過使用命名服務,客戶端應用能夠根據指定名字來獲取資源或服務的地址,提供者等資訊。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

2.分散式通訊面試

RabbitMQ 中的 broker 是指什麼?cluster 又是指什麼?
broker 是指一個或多個 erlang node 的邏輯分組,且 node 上執行著 RabbitMQ 應用程式。cluster 是在 broker 的基礎之上,增加了 node 之間共享後設資料的約束。

什麼是後設資料?後設資料分為哪些型別?包括哪些內容?與 cluster 相關的後設資料有哪些?後設資料是如何儲存的?後設資料在 cluster 中是如何分佈的?
在非 cluster 模式下,後設資料主要分為 Queue 後設資料(queue 名字和屬性等)、Exchange 後設資料(exchange 名字、型別和屬性等)、Binding 後設資料(存放路由關係的查詢表)、Vhost 後設資料(vhost 範圍內針對前三者的名字空間約束和安全屬性設定)。在cluster 模式下,還包括 cluster 中 node 位置資訊和 node 關係資訊。後設資料按照 erlangnode 的型別確定是僅儲存於 RAM 中,還是同時儲存在 RAM 和 disk 上。後設資料在 cluster中是全 node 分佈的。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

3.分散式資料庫面試

哨兵(Sentinel)和複製(Replication)
Redis伺服器毫無徵兆的罷工是個麻煩事,如何保證備份的機器是原始伺服器的完整備份呢?這時候就需要哨兵和複製。
Sentinel可以管理多個Redis伺服器,它提供了監控,提醒以及自動的故障轉移的功能,Replication則是負責讓一個Redis伺服器可以配備多個備份的伺服器。
Redis也是利用這兩個功能來保證Redis的高可用的

事務
很多情況下我們需要一次執行不止一個命令,而且需要其同時成功或者失敗。redis對事務的支援也是源自於這部分需求,即支援一次性按順序執行多個命令的能力,並保證其原子性。
2019年18家大廠Java面試題整理了350道(分散式+微服務+高併發)

讀者福利:資料太多,一共100多頁pdf,就不一一展示了,歡迎大家關注我的公眾號【程式設計師追風】,文章都會在裡面更新,整理的資料也會放在裡面。

最後

領取資料的朋友們,記得幫作者點贊轉發喲,感謝支援!

相關文章