天天看點

18家大廠Java面試題整理了350道(分布式+微服務+高并發)一、性能調優系列二、微服務系列三、并發程式設計系列四、開源架構系列五、分布式專題

一、性能調優系列

1.Tomcat性能調優

JVM參數調優:

  -Xms 表示JVM初始化堆的大小,

  -Xmx表示JVM堆的最大值。這兩個值的大小一般根據需要進行設定。

  當應用程式需要的記憶體超出堆的最大值時虛拟機就會提示記憶體溢出,并且導緻應用服務崩潰。

  是以- -般建議堆的最大值設定為可用記憶體的最大值的80%。

  在catalina.bat中,設定

JAVA _0PTS='-Xms256m-Xmx512m'

,表示初始化記憶體為256MB,可以使用的最大記憶體512MB。

2.JVM性能調優

Java類加載過程

18家大廠Java面試題整理了350道(分布式+微服務+高并發)一、性能調優系列二、微服務系列三、并發程式設計系列四、開源架構系列五、分布式專題

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原理

  

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

四、開源架構系列

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道(分布式+微服務+高并發)

18家大廠Java面試題整理了350道(分布式+微服務+高并發)一、性能調優系列二、微服務系列三、并發程式設計系列四、開源架構系列五、分布式專題

JAVA核心知識點

18家大廠Java面試題整理了350道(分布式+微服務+高并發)一、性能調優系列二、微服務系列三、并發程式設計系列四、開源架構系列五、分布式專題

繼續閱讀