欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖

  發(fā)布時間:2019-07-16 16:17:46   作者:孤獨的愛碼仕   我要評論
這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

JVM的內(nèi)存結(jié)構(gòu)

根據(jù) JVM 規(guī)范,JVM 內(nèi)存共分為虛擬機棧、堆、方法區(qū)、程序計數(shù)器、本地方法棧五個部分。

1. Java虛擬機棧:線程私有;每個方法在執(zhí)行的時候會創(chuàng)建一個棧幀,存儲了局部變量表,操作數(shù)棧,動態(tài)連接,方法返回地址等;每個方法從調(diào)用到執(zhí)行完畢,對應(yīng)一個棧幀在虛擬機棧中的入棧和出棧。

2. 堆:線程共享;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建,用于存放對象實例。

3. 方法區(qū):線程共享;被所有線程共享的一塊內(nèi)存區(qū)域;用于存儲已被虛擬機加載的類信息,常量,靜態(tài)變量等。

4. 程序計數(shù)器:線程私有;是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,每條線程都要有一個獨立的程序計數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存。

5. 本地方法棧:線程私有;主要為虛擬機使用到的Native方法服務(wù)。

為什么要用線程池

那先要明白什么是線程池

線程池是指在初始化一個多線程應(yīng)用程序過程中創(chuàng)建一個線程集合,然后在需要執(zhí)行新的任務(wù)時重用這些線程而不是新建一個線程。

使用線程池的好處

  1. 線程池改進(jìn)了一個應(yīng)用程序的響應(yīng)時間。由于線程池中的線程已經(jīng)準(zhǔn)備好且等待被分配任務(wù),應(yīng)用程序可以直接拿來使用而不用新建一個線程。
  2. 線程池節(jié)省了CLR 為每個短生存周期任務(wù)創(chuàng)建一個完整的線程的開銷并可以在任務(wù)完成后回收資源。
  3. 線程池根據(jù)當(dāng)前在系統(tǒng)中運行的進(jìn)程來優(yōu)化線程時間片。
  4. 線程池允許我們開啟多個任務(wù)而不用為每個線程設(shè)置屬性。
  5. 線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個包含狀態(tài)信息的對象引用。
  6. 線程池可以用來解決處理一個特定請求最大線程數(shù)量限制問題。

msyql優(yōu)化經(jīng)驗

1. 對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。

2. 應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進(jìn)行全表掃描。

3. 盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。

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

5. 避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。諸如此類,等等等等......

什么是線程死鎖?死鎖如何產(chǎn)生?如何避免線程死鎖?

死鎖的介紹:

線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,導(dǎo)致這些線程處于等待狀態(tài),無法前往執(zhí)行。當(dāng)線程進(jìn)入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調(diào)用wait方法,才釋放資源,在此期間,其他線程將不能進(jìn)入該代碼塊。當(dāng)線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產(chǎn)生死鎖。

死鎖的產(chǎn)生的一些特定條件:

  1. 互斥條件:進(jìn)程對于所分配到的資源具有排它性,即一個資源只能被一個進(jìn)程占用,直到被該進(jìn)程釋放 。
  2. 請求和保持條件:一個進(jìn)程因請求被占用資源而發(fā)生阻塞時,對已獲得的資源保持不放。
  3. 不剝奪條件:任何一個資源在沒被該進(jìn)程釋放之前,任何其他進(jìn)程都無法對他剝奪占用。
  4. 循環(huán)等待條件:當(dāng)發(fā)生死鎖時,所等待的進(jìn)程必定會形成一個環(huán)路(類似于死循環(huán)),造成永久阻塞。
     

如何避免:

1. 加鎖順序:當(dāng)多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發(fā)生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就不會發(fā)生。當(dāng)然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預(yù)知的。

2. 加鎖時限:加上一個超時時間,若一個線程沒有在給定的時限內(nèi)成功獲得所有需要的鎖,則會進(jìn)行回退并釋放所有已經(jīng)獲得的鎖,然后等待一段隨機的時間再重試。但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導(dǎo)致這些線程重復(fù)地嘗試但卻始終得不到鎖。

3. 死鎖檢測:死鎖檢測即每當(dāng)一個線程獲得了鎖,會在線程和鎖相關(guān)的數(shù)據(jù)結(jié)構(gòu)中(map、graph等等)將其記下。除此之外,每當(dāng)有線程請求鎖,也需要記錄在這個數(shù)據(jù)結(jié)構(gòu)中。死鎖檢測是一個更好的死鎖預(yù)防機制,它主要是針對那些不可能實現(xiàn)按序加鎖并且鎖超時也不可行的場景。

spring中Bean的作用域

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

2. prototype:每次通過Spring容器獲取prototype定義的bean時,容器都將創(chuàng)建一個新的Bean實例,每個Bean實例都有自己的屬性和狀態(tài),而singleton全局只有一個對象。

3. request:在一次Http請求中,容器會返回該Bean的同一實例。而對不同的Http請求則會產(chǎn)生新的Bean,而且該bean僅在當(dāng)前Http Request內(nèi)有效。

4. session:在一次Http Session中,容器會返回該Bean的同一實例。而對不同的Session請求則會創(chuàng)建新的實例,該bean實例僅在當(dāng)前Session內(nèi)有效。

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

Spring框架中都用到了哪些設(shè)計模式?

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

2. 單例模式:在spring配置文件中定義的bean默認(rèn)為單例模式。

3. 模板方法模式:用來解決代碼重復(fù)的問題。

4. 前端控制器模式:Spring提供了DispatcherServlet來對請求進(jìn)行分發(fā)。

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

6. 工廠模式:BeanFactory用來創(chuàng)建對象的實例。

springmvc的核心是什么,請求的流程是怎么處理的,控制反轉(zhuǎn)怎么實現(xiàn)的

核心:控制反轉(zhuǎn)和面向切面

請求處理流程:

  1. 首先用戶發(fā)送請求到前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進(jìn)行處理并把請求委托給它,即以前的控制器的控制邏輯部分;
  2. 頁面控制器接收到請求后,進(jìn)行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,并進(jìn)行驗證,然后將命令對象委托給業(yè)務(wù)對象進(jìn)行處理;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名);
  3. 前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;
  4. 前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶。

控制反轉(zhuǎn)如何實現(xiàn):

  1. 我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。
  2. spring中默認(rèn)的bean為單實例模式,通過bean的class引用反射機制可以創(chuàng)建這個實例。
  3. 因此,spring框架通過反射替我們創(chuàng)建好了實例并且替我們維護(hù)他們。
  4. A需要引用B類,spring框架就會通過xml把B實例的引用傳給了A的成員變量。

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

Spring DAO 中最常用的類是什么?
如何在Spring應(yīng)用中使用SLF4J?
Spring bean 的默認(rèn)作用范圍是?
使用@Required但不關(guān)聯(lián)bean 來注解setter方法,將會發(fā)生?
已知一棵二叉樹前序遍歷和中序遍歷分別為ABDEGCFH和DBGEACHF,則該二叉樹的后序遍歷為?
volatile關(guān)鍵字是否能保證線程安全?
Java能不能不通過構(gòu)造函數(shù)創(chuàng)建對象?
Java程序的并發(fā)機制是?
方法resume()負(fù)責(zé)恢復(fù)哪些線程的執(zhí)行?
什么是LinkedHashSet?
什么是可變參數(shù)?
斷言的用途?
什么時候使用斷言?
什么是垃圾回收?
用一個例子解釋垃圾回收?
什么時候運行垃圾回收?
垃圾回收的最佳做法?
什么是初始化數(shù)據(jù)塊?
什么是靜態(tài)初始化器?
什么是實例初始化塊?
什么是正則表達(dá)式?
什么是令牌化?
給出令牌化的例子?
如何使用掃描器類(Scanner Class)令牌化?
如何添加小時(hour)到一個日期對象(Date Objects)?
如何格式化日期對象?
Java中日歷類(Calendar Class)的用途?
如何在Java中獲取日歷類的實例?
解釋一些日歷類中的重要方法?
數(shù)字格式化類(Number Format Class)的用途?

相關(guān)文章

  • 10道JVM常見面試題解析(附答案)

    這篇文章主要介紹了10道JVM常見面試題解析(附答案),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)
    2020-09-04
  • JVM相關(guān)面試題及答案(小結(jié))

    這篇文章主要介紹了JVM相關(guān)面試題及答案(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-09-02
  • 2020面試阿里字節(jié)跳動90%被問到的JVM面試題附答案(史上最全)

    這篇文章主要介紹了2020面試阿里字節(jié)跳動90%被問到的JVM面試題附答案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-06-15
  • 2020年JVM高頻率面試題整理

    這篇文章主要介紹了2020年JVM高頻率面試題整理,真是小編下了血本給大家整理出來的,值得大家收藏,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-09
  • JVM面試題小結(jié)(2020最新版)

    這篇文章主要介紹了JVM面試題小結(jié)(2020最新版),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-02-21
  • 2019年JVM面試都問了什么?(附答案解析)

    這篇文章主要介紹了2019年JVM面試都問了什么?(附答案解析),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-12-04
  • 講一講JVM的組成(Java經(jīng)典面試題)

    JVM(Java 虛擬機)算是面試必問的問題的了,而但凡問 JVM 一定會問的第一個問題就是:講一講 JVM 的組成?那本文就注重講一下 JVM 的組成,感興趣的可以了解一下
    2019-04-10
  • 30道有趣的JVM面試題(小結(jié))

    這篇文章主要介紹了30道有趣的JVM面試題(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-11-26

最新評論