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

前言

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

前段時間一直有粉絲問我,有沒有今年一些大廠Java面試題總結?最新抽時間整理了一些,分享給你們,你們一塊兒共享學習!

1、性能調優系列

1.Tomcat性能調優

JVM參數調優: -Xms<size> 表示JVM初始化堆的大小,一Xmx<size>表示JVM堆的最大值。這兩個值的大小通常根據須要進行設置。當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰。所以- -般建議堆的最大值設置爲可用內存的最大值的80%。在catalina.bat中,設置JAVA _0PTS='-Xms256m-Xmx512m',表示初始化內存爲256MB,可使用的最大內存512MB。

2.JVM性能調優

Java類加載過程 

Java類加載須要經歷一下7個過程: node

1.加載 程序員

加載是類加載的第一個過程,在這個階段,將完成一下三件事情
(1)經過一個類的全限定名獲取該類的二進制流。
(2)將該二進制流中的靜態存儲結構轉化爲方法去運行時數據結構。
(3)在內存中生成該類的Class對象,做爲該類的數據訪問入口。 web

2.驗證
驗證的目的是爲了確保Class文件的字節流中的信息不回危害到虛擬機.在該階段主要完成如下四鍾驗證:
(1)文件格式驗證:驗證字節流是否符合Class文件的規範,如主次版本號是否在當前虛擬機範圍內,常量池中的常量是否有不被支持的類型.
(2)元數據驗證:對字節碼描述的信息進行語義分析,如這個類是否有父類,是否集成了不被繼承的類等。
(3)字節碼驗證:是整個驗證過程當中最複雜的一個階段,經過驗證數據流和控制流的分析,肯定程序語義是否正確,主要針對方法體的驗證。如:方法中的類型轉換是否正確,跳轉指令是否正確等。
(4)符號引用驗證:這個動做在後面的解析過程當中發生,主要是爲了確保解析動做能正確執行。

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 的執行;

2、微服務系列

1.Spring Cloud面試

什麼是 Spring Cloud?面試

Spring cloud 流應用程序啓動器是基於 Spring Boot 的 Spring 集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。

使用 Spring Cloud 有什麼優點?
使用 Spring Boot 開發分佈式微服務時,咱們面臨如下問題
1.與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
2.服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該
目錄中註冊服務,而後可以查找並鏈接到該目錄中的服務。
3. 冗餘-分佈式系統中的冗餘問題。
4. 負載平衡 --負載平衡改善跨多個計算資源的工做負荷,諸如計算機,計算機集羣,網絡鏈路,中央
處理單元,或磁盤驅動器的分佈。
5.性能-問題 因爲各類運營開銷致使的性能問題。
6. 部署複雜性-Devops 技能的要求。

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)中加載後續的應用程序屬性文件。

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 協議

3、併發編程系列

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,這點我不能肯定。

2.AQS框架

什麼是AQS
AQS是AbustactQueuedSynchronizer的簡稱,它是一個Java提升的底層同步工具類,用一個int類型的變量表示同步狀態,並提供了一系列的CAS操做來管理這個同步狀態。
AQS是一個用來構建鎖和同步器的框架,使用AQS能簡單且高效地構造出應用普遍的大量的同步器,好比咱們提到的ReentrantLock,Semaphore,其餘的諸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基於AQS的。
AQS支持兩種同步方式:
1.獨佔式
2.共享式
這樣方便使用者實現不一樣類型的同步組件,獨佔式如ReentrantLock,共享式如Semaphore,CountDownLatch,組合式的如ReentrantReadWriteLock。總之,AQS爲使用提供了底層支撐,如何組裝實現,使用者能夠自由發揮。

3.Java線程池

若是你提交任務時,線程池隊列已滿,這時會發生什麼?
這裏區分一下:
若是使用的是無界隊列LinkedBlockingQueue,也就是無界隊列的話,不要緊,繼續添加任務到阻塞隊列中等待執行,由於LinkedBlockingQueue能夠近乎認爲是一個無窮大的隊列,能夠無限存聽任務 若是使用的是有界隊列好比ArrayBlockingQueue,任務首先會被添加到ArrayBlockingQueue中,ArrayBlockingQueue滿了,會根據maximumPoolSize的值增長線程數量,若是增長了線程數量仍是處理不過來,ArrayBlockingQueue繼續滿,那麼則會使用拒絕策略RejectedExecutionHandler處理滿了的任務,默認是AbortPolicy

4、開源框架系列

1.spring面試

什麼是 Spring 框架,Spring 框架有哪些主要模塊
Spring 框架是一個爲 Java 應用程序開發提供綜合、普遍的基礎性支持的 Java 平臺。
Spring 幫助開發者解決了開發中基礎性的問題,使得開發人員能夠專一於應用程序的開發。
Spring 框架自己也是按照設計模式精心打造的,這使得咱們能夠在開發環境中安心地集成
Spring 框架,沒必要擔憂 Spring 是如何在後臺工做的。

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.視圖將結果返回到客戶端

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 的過程)。

5、分佈式專題

1.分佈式限流面試

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

Zookeeper 都有哪些功能?
1. 集羣管理:監控節點存活狀態、運行請求等;
2. 主節點選舉:主節點掛掉了以後能夠從備用的節點開始新一輪選主,主節點選舉說的就是這個選舉的過程,使用 Zookeeper 能夠協助完成這個過程;
3. 分佈式鎖:Zookeeper 提供兩種鎖:獨佔鎖、共享鎖。獨佔鎖即一次只能有一個線程使用資源,共享鎖是讀鎖共享,讀寫互斥,便可以有多線線程同時讀同一個資源,若是要使用寫鎖也只能有一個線程使用。Zookeeper 能夠對分佈式鎖進行控制。
4. 命名服務:在分佈式系統中,經過使用命名服務,客戶端應用可以根據指定名字來獲取資源或服務的地址,提供者等信息。

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 分佈的。

3.分佈式數據庫面試

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

事務
不少狀況下咱們須要一次執行不止一個命令,並且須要其同時成功或者失敗。redis對事務的支持也是源自於這部分需求,即支持一次性按順序執行多個命令的能力,並保證其原子性。

讀者福利:資料太多,一共100多頁pdf,就不一一展現了,歡迎你們關注個人公衆號【程序員追風】,文章都會在裏面更新,整理的資料也會放在裏面。

最後

領取資料的朋友們,記得幫做者點贊轉發喲,感謝支持!
相關文章
相關標籤/搜索