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

一、性能調優系列

1.Tomcat性能調優

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

2.JVM性能調優

Java類加載過程
在這裏插入圖片描述
Java類加載需要經歷一下7個過程:

  1. 加載

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

  1. 驗證

驗證的目的是爲了確保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 的執行;

二、微服務系列

1.Spring Cloud面試

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

使用 Spring Cloud 有什麼優勢?
使用 Spring Boot 開發分佈式微服務時,我們面臨以下問題

  1. 與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
  2. 服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該
    目錄中註冊服務,然後能夠查找並連接到該目錄中的服務。
  3. 冗餘-分佈式系統中的冗餘問題。
  4. 負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機集羣,網絡鏈路,中央
    處理單元,或磁盤驅動器的分佈。
    5.性能-問題 由於各種運營開銷導致的性能問題。
  5. 部署複雜性-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 協議

三、併發編程系列

1.Synchronized原理

  synchronizedReentrantLock的區別?
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

四、開源框架系列

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

五、分佈式專題

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對事務的支持也是源自於這部分需求,即支持一次性按順序執行多個命令的能力,並保證其原子性。

文檔:上圖

Java面試題整理了350道(分佈式+微服務+高併發)

在這裏插入圖片描述

JAVA核心知識點

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章