字節跳動Java研發面試99題(含答案):JVM+Spring+MySQL+線程池+鎖

JVM的內存結構

根據 JVM 規範,JVM 內存共分爲虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。前端

1. Java虛擬機棧:線程私有;每一個方法在執行的時候會建立一個棧幀,存儲了局部變量表,操做數棧,動態鏈接,方法返回地址等;每一個方法從調用到執行完畢,對應一個棧幀在虛擬機棧中的入棧和出棧。面試

2. 堆:線程共享;被全部線程共享的一塊內存區域,在虛擬機啓動時建立,用於存放對象實例。正則表達式

3. 方法區:線程共享;被全部線程共享的一塊內存區域;用於存儲已被虛擬機加載的類信息,常量,靜態變量等。spring

4. 程序計數器:線程私有;是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱爲「線程私有」的內存。設計模式

5. 本地方法棧:線程私有;主要爲虛擬機使用到的Native方法服務。安全

爲何要用線程池

那先要明白什麼是線程池session

線程池是指在初始化一個多線程應用程序過程當中建立一個線程集合,而後在須要執行新的任務時重用這些線程而不是新建一個線程。數據結構

使用線程池的好處多線程

  1. 線程池改進了一個應用程序的響應時間。因爲線程池中的線程已經準備好且等待被分配任務,應用程序能夠直接拿來使用而不用新建一個線程。
  2. 線程池節省了CLR 爲每一個短生存週期任務建立一個完整的線程的開銷並能夠在任務完成後回收資源。
  3. 線程池根據當前在系統中運行的進程來優化線程時間片。
  4. 線程池容許咱們開啓多個任務而不用爲每一個線程設置屬性。
  5. 線程池容許咱們爲正在執行的任務的程序參數傳遞一個包含狀態信息的對象引用。
  6. 線程池能夠用來解決處理一個特定請求最大線程數量限制問題。

MySQL優化經驗

  1. 對查詢進行優化,應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索引。併發

  2. 應儘可能避免在 where 子句中使用!=或<>操做符,不然引擎將放棄使用索引而進行全表掃描。

  3. 儘可能使用數字型字段,若只含數值信息的字段儘可能不要設計爲字符型,這會下降查詢和鏈接的性能,並會增長存儲開銷。這是由於引擎在處理查詢和鏈接時會逐個比較字符串中每個字符,而對於數字型而言只須要比較一次就夠了。

  4. 任何地方都不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何字段。

  5. 避免頻繁建立和刪除臨時表,以減小系統表資源的消耗。諸如此類,等等等等......

什麼是線程死鎖?死鎖如何產生?如何避免線程死鎖?

死鎖的介紹

線程死鎖是指因爲兩個或者多個線程互相持有對方所須要的資源,致使這些線程處於等待狀態,沒法前往執行。當線程進入對象的synchronized代碼塊時,便佔有了資源,直到它退出該代碼塊或者調用wait方法,才釋放資源,在此期間,其餘線程將不能進入該代碼塊。當線程互相持有對方所須要的資源時,會互相等待對方釋放資源,若是線程都不主動釋放所佔有的資源,將產生死鎖。

死鎖的產生的一些特定條件

  1. 互斥條件:進程對於所分配到的資源具備排它性,即一個資源只能被一個進程佔用,直到被該進程釋放 。
  2. 請求和保持條件:一個進程因請求被佔用資源而發生阻塞時,對已得到的資源保持不放。
  3. 不剝奪條件:任何一個資源在沒被該進程釋放以前,任何其餘進程都沒法對他剝奪佔用。
  4. 循環等待條件:當發生死鎖時,所等待的進程一定會造成一個環路(相似於死循環),形成永久阻塞。

如何避免

1. 加鎖順序:當多個線程須要相同的一些鎖,可是按照不一樣的順序加鎖,死鎖就很容易發生。若是能確保全部的線程都是按照相同的順序得到鎖,那麼死鎖就不會發生。固然這種方式須要你事先知道全部可能會用到的鎖,然而總有些時候是沒法預知的。

2. 加鎖時限:加上一個超時時間,若一個線程沒有在給定的時限內成功得到全部須要的鎖,則會進行回退並釋放全部已經得到的鎖,而後等待一段隨機的時間再重試。可是若是有很是多的線程同一時間去競爭同一批資源,就算有超時和回退機制,仍是可能會致使這些線程重複地嘗試但卻始終得不到鎖。

3. 死鎖檢測:死鎖檢測即每當一個線程得到了鎖,會在線程和鎖相關的數據結構中(map、graph等等)將其記下。除此以外,每當有線程請求鎖,也須要記錄在這個數據結構中。死鎖檢測是一個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖而且鎖超時也不可行的場景。

spring中Bean的做用域

1. singleton:Spring IoC容器中只會存在一個共享的Bean實例,不管有多少個Bean引用它,始終指向同一對象。Singleton做用域是Spring中的缺省做用域。

2. prototype:每次經過Spring容器獲取prototype定義的bean時,容器都將建立一個新的Bean實例,每一個Bean實例都有本身的屬性和狀態,而singleton全局只有一個對象。

3. request:在一次Http請求中,容器會返回該Bean的同一實例。而對不一樣的Http請求則會產生新的Bean,並且該bean僅在當前Http Request內有效。

4. session:在一次Http Session中,容器會返回該Bean的同一實例。而對不一樣的Session請求則會建立新的實例,該bean實例僅在當前Session內有效。

5. global Session:在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。

Spring框架中都用到了哪些設計模式?

1. 代理模式:在AOP和remoting中被用的比較多。

2. 單例模式:在spring配置文件中定義的bean默認爲單例模式。

3. 模板方法模式:用來解決代碼重複的問題。

4. 前端控制器模式:Spring提供了DispatcherServlet來對請求進行分發。

5. 依賴注入模式:貫穿於BeanFactory / ApplicationContext接口的核心理念。

6. 工廠模式:BeanFactory用來建立對象的實例。

springmvc的核心是什麼,請求的流程是怎麼處理的,控制反轉怎麼實現的

核心:控制反轉和麪向切面

請求處理流程

  1. 首先用戶發送請求到前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪個頁面控制器進行處理並把請求委託給它,即之前的控制器的控制邏輯部分;
  2. 頁面控制器接收到請求後,進行功能處理,首先須要收集和綁定請求參數到一個對象,並進行驗證,而後將命令對象委託給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);
  3. 前端控制器收回控制權,而後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;
  4. 前端控制器再次收回控制權,將響應返回給用戶。

控制反轉如何實現

  • 咱們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。
  • spring中默認的bean爲單實例模式,經過bean的class引用反射機制能夠建立這個實例。
  • 所以,spring框架經過反射替咱們建立好了實例而且替咱們維護他們。
  • A須要引用B類,spring框架就會經過xml把B實例的引用傳給了A的成員變量。

BAT大廠Java高級面試題常見30問

  1. Spring DAO 中最經常使用的類是什麼?
  2. 如何在Spring應用中使用SLF4J?
  3. Spring bean 的默認做用範圍是?
  4. 使用@Required但不關聯bean 來註解setter方法,將會發生?
  5. 已知一棵二叉樹前序遍歷和中序遍歷分別爲ABDEGCFH和DBGEACHF,則該二叉樹的後序遍歷爲?
  6. volatile關鍵字是否能保證線程安全?
  7. Java能不能不經過構造函數建立對象?
  8. Java程序的併發機制是?
  9. 方法resume()負責恢復哪些線程的執行?
  10. 什麼是LinkedHashSet?
  11. 什麼是可變參數?
  12. 斷言的用途?
  13. 何時使用斷言?
  14. 什麼是垃圾回收?
  15. 用一個例子解釋垃圾回收?
  16. 何時運行垃圾回收?
  17. 垃圾回收的最佳作法?
  18. 什麼是初始化數據塊?
  19. 什麼是靜態初始化器?
  20. 什麼是實例初始化塊?
  21. 什麼是正則表達式?
  22. 什麼是令牌化?
  23. 給出令牌化的例子?
  24. 如何使用掃描器類(Scanner Class)令牌化?
  25. 如何添加小時(hour)到一個日期對象(Date Objects)?
  26. 如何格式化日期對象?
  27. Java中日曆類(Calendar Class)的用途?
  28. 如何在Java中獲取日曆類的實例?
  29. 解釋一些日曆類中的重要方法?
  30. 數字格式化類(Number Format Class)的用途?

讀者福利

因爲篇幅有限,部分答案就不作所有展現了,這些面試題的答案我已經整理成PDF文檔了,同時也整理了一些問題詳解;雖說花了一點時間,可是我也願意把它免費分享出來,但願可以幫助到有須要的Java工程師朋友,也省的你們再去網上花時間找資料。

領取方式,公衆號後臺回覆【面試】,便可免費領取

相關文章
相關標籤/搜索