版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
歷年Java面試分類100題(一)
—?、Java基礎(chǔ)篇
1、Java中的Math,round(-1.5)等于多少?
【僅供參考】
等于T,因為在數(shù)軸上取值時,中間值(0.5)向右取整,所以正0.5是往上
取整,負0.5是直接舍棄。
2、為什么不能用浮點型表示金額?
【僅供參考】
由于計算機中保存的小數(shù)其實是十進制的小數(shù)的近似值,并不是準確值,所
以,千萬不要在代碼中使用浮點數(shù)來表示金額等重要的指標。
建議使用BigDecimal或者Long來表示金額。
3、Strings="xyz"和Strings=newString("xyz”)區(qū)別?
【僅供參考】
兩個語句都會先去字符串常量池中檢查是否已經(jīng)存在“xyz”,如果有則直接
使用,如果沒有則會在常量池中創(chuàng)建“xyz”對象。
另外,Strings=newString("xyz")還會通過newString()在堆里創(chuàng)建一
個內(nèi)容與"xyz”相同的對象實例。
所以前者其實理解為被后者的所包含。
4、Files的常用方法都有哪些?
【僅供參考】
Files.exists。:檢測文件路徑是否存在。
Files.createFileO:創(chuàng)建文件。
Files.createDirectory():創(chuàng)建文件夾。
Files.deleteO:刪除一個文件或目錄。
Files.copy():復(fù)制文件。
Files.move():移動文件。
Files.size():查看文件個數(shù)。
Files.read():讀取文件。
Files.write():寫入文件。
5、為什么不能根據(jù)返回類型來區(qū)分重載?
【僅供參考】
如果我們有兩個方法如下,當我們調(diào)用:test(l)時,編譯器無法確認要調(diào)用
的是哪個。
//方法1
inttest(inta);
//方法2
longtest(inta);
方法的返回值只是作為方法運行之后的一個“狀態(tài)”,但是并不是所有調(diào)用都
關(guān)注返回值,所以不能將返回值作為重載的唯一區(qū)分條件。
6、重載(Overload)和重寫(Override)的區(qū)別?
【僅供參考】
方法的重載和重寫都是實現(xiàn)多態(tài)的方式,區(qū)別在于前者實現(xiàn)的是編譯時的多態(tài)
性,而后者實現(xiàn)的是運行時的多態(tài)性。
重載:一個類中有多個同名的方法,但是具有有不同的參數(shù)列表(參數(shù)類型不
同、參數(shù)個數(shù)不同或者二者都不同)。
重寫:發(fā)生在子類與父類之間,子類對父類的方法進行重寫,參數(shù)都不能改
變,返回值類型可以不相同,但是必須是父類返回值的派生類。即外殼不變,
核心重寫!重寫的好處在于子類可以根據(jù)需要,定義特定于自己的行為。
7、抽象類(abstractclass)和接口(interface)有什么區(qū)別?
【僅供參考】
抽象類只能單繼承,接口可以多實現(xiàn)。
抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
抽象類中可以有成員變量,接口中沒有成員變量,只能有常量(默認就是
publicstaticfinal)
抽象類中可以包含非抽象的方法,在Java7之前接口中的所有方法都是抽象
的,在Java8之后,接口支持非抽象方法:default方法、靜態(tài)方法等。
Java9支持私有方法、私有靜態(tài)方法。
抽象類中的方法類型可以是任意修飾符,Java8之前接口中的方法只能是
public類型,Java9支持private類型。
設(shè)計思想的區(qū)別:
接口是自上而下的抽象過程,接口規(guī)范了某些行為,是對某一行為的抽象。我
需要這個行為,我就去實現(xiàn)某個接口,但是具體這個行為怎么實現(xiàn),完全由自
己決定。
抽象類是自下而上的抽象過程,抽象類提供了通用實現(xiàn),是對某一類事物的抽
象。我們在寫實現(xiàn)類的時候,發(fā)現(xiàn)某些實現(xiàn)類具有幾乎相同的實現(xiàn),因此我們
將這些相同的實現(xiàn)抽取出來成為抽象類,然后如果有一些差異點,則可以提供
抽象方法來支持自定義實現(xiàn)。
我在網(wǎng)上看到有個說法,挺形象的:
普通類像親爹,他有啥都是你的。
抽象類像叔伯,有一部分會給你,還能指導(dǎo)你做事的方法。
接口像干爹,可以給你指引方法,但是做成啥樣得你自己努力實現(xiàn)。
8、==和equals的區(qū)別是什么?
【僅供參考】
==:運算符,用于比較基礎(chǔ)類型變量和引用類型變量。
對于基礎(chǔ)類型變量,比較的變量保存的值是否相同,類型不一定要相同。
對于引用類型變量,比較的是兩個對象的地址是否相同。
equals:Object類中定義的方法,通常用于比較兩個對象的值是否相等。
equals在Object方法中其實等同于==,但是在實際的使用中,equals通常
被重寫用于比較兩個對象的值是否相同。
9、如何實現(xiàn)對象克???
【僅供參考】
實現(xiàn)Cloneable接口并重寫Object類中的clone。方法。
實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)
真正的深度克隆。
10>String,StringBuffer和StringBuilder區(qū)別
【僅供參考】
可變性
String不可變
StringBuffer和StringBuilder可變
線程安全
String不可變,因此是線程安全的
StringBuilder不是線程安全的
StringBuffer是線程安全的,內(nèi)部使用synchronized進行同步
11、闡述final、finally、finalize的區(qū)別。
【僅供參考】
其實是三個完全不相關(guān)的東西,只是長的有點像。。
final如上所示。
finally:finally是對Java異常處理機制的最佳補充,通常配合try、
catch使用,用于存放那些無論是否出現(xiàn)異常都一定會執(zhí)行的代碼。在實際使
用中,通常用于釋放鎖、數(shù)據(jù)庫連接等資源,把資源釋放方法放到finally
中,可以大大降低程序出錯的幾率。
finalize:Object中的方法,在垃圾收集器將對象從內(nèi)存中清除出去之前做必
要的清理工作。finalize。方法僅作為了解即可,在Java9中該方法已經(jīng)被
標記為廢棄,并添加新的java.lang.ref.Cleaner,提供了更靈活和有效的方
法來釋放資源。這也側(cè)面說明了,這個方法的設(shè)計是失敗的,因此更加不能去
使用它。
12、BIO、NIO、AI0有什么區(qū)別?
【僅供參考】
BIO:Block10同步阻塞式10,就是我們平常使用的傳統(tǒng)10,它的特點是模
式簡單使用方便,并發(fā)處理能力低。
NIO:Non10同步非阻塞10,是傳統(tǒng)10的升級,客戶端和服務(wù)器端通過
Channel(通道)通訊,實現(xiàn)了多路復(fù)用。
AIO:Asynchronous10是NI0的升級,也叫NI02,實現(xiàn)了異步非堵塞10,
異步10的操作基于事件和回調(diào)機制。
13、Object常用方法有哪些?
【僅供參考】
Java面試經(jīng)常會出現(xiàn)的一道題目,Object的常用方法。下面給大家整理一下。
Object常用方法有:toStringO>equals()hashCode()>clone。等。
14^==和equals的區(qū)別是什么?
【僅供參考】
對于基本類型和引用類型==的作用效果是不同的。
基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同;
equals本質(zhì)上就是==,只不過String和Integer等重寫了equals方法。
==對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而
equals默認情況下是引用比較,只是很多類重新了equals方法,比如
String、Integer等把它變成了值比較,所以一般情況下equals比較的是值
是否相等。
15、Java常見異常有哪些
【僅供參考】
java.lang.IllegalAccessError:違法訪問錯誤。當一個應(yīng)用試圖訪問、修改
某個類的域(Field)或
者調(diào)用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。
java.lang.InstantiationError:實例化錯誤。當一個應(yīng)用試圖通過Java的
new操作符構(gòu)造一個抽象
類或者接口時拋出該異常.
java.lang.OutOfMemoryError:內(nèi)存不足錯誤。當可用內(nèi)存不足以讓Java虛擬
機分配給一個對象
時拋出該錯誤。
java.lang.StackOverflowError:堆棧溢出錯誤。當一個應(yīng)用遞歸調(diào)用的層次
太深而導(dǎo)致堆棧溢出
或者陷入死循環(huán)時拋出該錯誤。
java.lang.ClassCastException:類造型異常。假設(shè)有類A和B(A不是B的父
類或子類),0是A的
實例,那么當強制將0構(gòu)造為類B的實例時拋出該異常。該異常經(jīng)常被稱為強
制類型轉(zhuǎn)換異常。
java.lang.ClassNotFoundException:找不到類異常。當應(yīng)用試圖根據(jù)字符串
形式的類名構(gòu)造類,
而在遍歷CLASSPAH之后找不到對應(yīng)名稱的class文件時,拋出該異常。
java.lang.ArithmeticException:算術(shù)條件異常。譬如:整數(shù)除零等。
java.lang.ArraylndexOutOfBoundsException:數(shù)組索引越界異常。當對數(shù)組
的索引值為負數(shù)或
大于等于數(shù)組大小時拋出。
java.lang.IndexOutOfBoundsException:索引越界異常。當訪問某個序列的索
引值小于0或大于
等于序列大小時,拋出該異常。
java.lang.InstantiationException:實例化異常。當試圖通過
newlnstance()方法創(chuàng)建某個類的實
例,而該類是一個抽象類或接口時,拋出該異常。
java.lang.NoSuchFieldException:屬性不存在異常。當訪問某個類的不存在
的屬性時拋出該異
常。
java.lang.NoSuchMethodException:方法不存在異常。當訪問某個類的不存在
的方法時拋出該
異常。-
java.lang.NullPointerException:空指針異常。當應(yīng)用試圖在要求使用對象
的地方使用了null時,
拋出該異常。譬如:調(diào)用null對象的實例方法、訪問null對象的屬性、計算
null對象的長度、使用
throw語句拋出null等等。
java.lang.NumberFormatException:數(shù)字格式異常。當試圖將一個String轉(zhuǎn)
換為指定的數(shù)字類
型,而該字符串確不滿足數(shù)字類型要求的格式時,拋出該異常。
java.lang.StringlndexOutOfBoundsException:字符串索引越界異常。當使用
索引值訪問某個字
符串中的字符,而該索引值小于0或大于等于序列大小時,拋出該異常。
16、throw和throws的區(qū)別是什么?
【僅供參考】
Java中的異常處理除了包括捕獲異常和處理異常之外,還包括聲明異常和拋出
異常,可以通過
throws關(guān)鍵字在方法上聲明該方法要拋出的異常,或者在方法內(nèi)部通過throw
拋出異常對象。
throws關(guān)鍵字和throw關(guān)鍵字在使用上的幾點區(qū)別如下:
throw關(guān)鍵字用在方法內(nèi)部,只能用于拋出一種異常,用來拋出方法或代碼塊
中的異常,受查異常
和非受查異常都可以被拋出。
throws關(guān)鍵字用在方法聲明上,可以拋出多個異常,用來標識該方法可能拋出
的異常列表。一個
方法用throws標識了可能拋出的異常列表,調(diào)用該方法的方法中必須包含可
處理異常的代碼,否
則也要在方法簽名中用throws關(guān)鍵字聲明相應(yīng)的異常。
17、try-catch-finally中,如果catch中return了,finally還會執(zhí)行
嗎?
【僅供參考】
答:會執(zhí)行,在return前執(zhí)行。
注意:在finally中改變返回值的做法是不好的,因為如果存在finally代
碼塊,try中的return語
句不會立馬返回調(diào)用者,而是記錄下返回值待finally代碼塊執(zhí)行完畢之后再
向調(diào)用者返回其值,
然后如果在finally中修改了返回值,就會返回修改后的值。顯然,在
finally中返回或者修改返回
值會對程序造成很大的困擾,C#中直接用編譯錯誤的方式來阻止程序員干這種
齷齪的事情,Java
中也可以通過提升編譯器的語法檢查級別來產(chǎn)生警告或錯誤。
18、final、finally%finalize有什么區(qū)別?
【僅供參考】
final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表
示此方法和此變量不能在被改變,只能使用。
finally:是try{}catch{}finally!)最后一部分,表示不論發(fā)生任何情況
都會執(zhí)行,finally部分可以省略,但如果finally部分存在,則一定會執(zhí)行
finally里面的代碼。
finalize:是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收
對象的此方法。
19、Error和Exception區(qū)別是什么?
【僅供參考】
Error類型的錯誤通常為虛擬機相關(guān)錯誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出
等,編譯器不會對這
類錯誤進行檢測,JAVA應(yīng)用程序也不應(yīng)對這類錯誤進行捕獲,一旦這類錯誤發(fā)
生,通常應(yīng)用程序
會被終止,僅靠應(yīng)用程序本身無法恢復(fù);
Exception類的錯誤是可以在應(yīng)用程序中進行捕獲并處理的,通常遇到這種錯
誤,應(yīng)對其進行處
理,使應(yīng)用程序可以繼續(xù)正常運行。
20、運行時異常和一般異常(受檢異常)區(qū)別是什么?
【僅供參考】
運行時異常包括RuntimeException類及其子類,表示JVM在運行期間可能出
現(xiàn)的異常。Java編
譯器不會檢查運行時異常。
受檢異常是Exception中除RuntimeException及其子類之外的異常。Java
編譯器會檢查受檢異常。
RuntimeException異常和受檢異常之間的區(qū)別:是否強制要求調(diào)用者必須處理
此異常,如果強
制要求調(diào)用者必須進行處理,那么就使用受檢異常,否則就選擇非受檢異常
(RuntimeException)0一般來講,如果沒有特殊的要求,我們建議使用
RuntimeException異常。
二、Java進階篇
1、HashMap的插入流程是怎么樣的?
【僅供參考】
略,從基本邏輯處理,到紅黑樹,,到鏈表講解
2、多線程中synchronized鎖升級的原理是什么?
【僅供參考】
synchronized鎖升級原理:在鎖對象的對象頭里面有一個threadid字段,在
第一次訪問的時候threadid為空,jvm讓其持有偏向鎖,并將threadid設(shè)
置為其線程id,再次進入的時候會先判斷threadid是否與其線程id一致,
如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖為輕量級鎖,通
過自旋循環(huán)一定次數(shù)來獲取鎖,執(zhí)行一定次數(shù)之后,如果還沒有正常獲取到要
使用的對象,此時就會把鎖從輕量級升級為重量級鎖,此過程就構(gòu)成了
synchronized鎖的升級。
鎖的升級的目的:鎖升級是為了減低了鎖帶來的性能消耗。在Java6之后優(yōu)
化synchronized的實現(xiàn)方式,使用了偏向鎖升級為輕量級鎖再升級到重量級
鎖的方式,從而減低了鎖帶來的性能消耗。
3、什么是死鎖?
【僅供參考】
當線程A持有獨占鎖a,并嘗試去獲取獨占鎖b的同時,線程B持有獨占鎖
b,并嘗試獲取獨占鎖a的情況下,就會發(fā)生AB兩個線程由于互相持有對方
需要的鎖,而發(fā)生的阻塞現(xiàn)象,我們稱為死鎖。
4、守護線程是什么?
【僅供參考】
守護線程是運行在后臺的一種特殊進程。它獨立于控制終端并且周期性地執(zhí)行
某種任務(wù)或等待處理某些發(fā)生的事件。在Java中垃圾回收線程就是特殊的守
護線程。
5、說一下atomic的原理?
【僅供參考】
atomic主要利用CAS(CompareAndWwap)和volatile和native方法來保
證原子操作,從而避免synchronized的高開銷,執(zhí)行效率大為提升。
6、線程B怎么知道線程A修改了變量
【僅供參考】
(1)volatile修飾變量
(2)synchronized修飾修改變量的方法
(3)wait/notify
(4)while輪詢
7、線程和進程的區(qū)別?
【僅供參考】
一個程序下至少有一個進程,一個進程下至少有一個線程,一個進程下也可以
有多個線程來增加程序的執(zhí)行速度。
8、如何停止一個正在運行的線程?
【僅供參考】
有幾種方式。
1、使用線程的stop方法。
使用stop。方法可以強制終止線程。不過stop是一個被廢棄掉的方法,不推
薦使用。
使用Stop方法,會一直向上傳播ThreadDeath異常,從而使得目標線程解鎖所
有鎖住的監(jiān)視器,即釋放掉所有的對象鎖。使得之前被鎖住的對象得不到同步
的處理,因此可能會造成數(shù)據(jù)不一致的問題。
2、使用interrupt方法中斷線程,該方法只是告訴線程要終止,但最終何時
終止取決于計算機。調(diào)用interrupt方法僅僅是在當前線程中打了一個停止的
標記,并不是真的停止線程。
接著調(diào)用Thread.currentThread().islnterrupted()方法,可以用來判斷當前
線程是否被終止,通過這個判斷我們可以做一些業(yè)務(wù)邏輯處理,通常如果
islnterrupted返回true的話,會拋一個中斷異常,然后通過try-catch捕
獲。
3、設(shè)置標志位
設(shè)置標志位,當標識位為某個值時,使線程正常退出。設(shè)置標志位是用到了共
享變量的方式,為了保證共享變量在內(nèi)存中的可見性,可以使用volatile修飾
它,這樣的話,變量取值始終會從主存中獲取最新值。
但是這種volatile標記共享變量的方式,在線程發(fā)生阻塞時是無法完成響應(yīng)
的。比如調(diào)用Thread,sleep。方法之后,線程處于不可運行狀態(tài),即便是主
線程修改了共享變量的值,該線程此時根本無法檢查循環(huán)標志,所以也就無法
實現(xiàn)線程中斷。
因此,interrupt。加上手動拋異常的方式是目前中斷一個正在運行的線程最
為正確的方式了。
9、什么是AQS
【僅供參考】
AQS是AbustactQueuedSynchronizer的簡稱,它是一個Java提高的底層同
步工具類,用一個int類型的變量表示同步狀態(tài),并提供了一系列的CAS操
作來管理這個同步狀態(tài)。
AQS是一個用來構(gòu)建鎖和同步器的框架,使用AQS能簡單且高效地構(gòu)造出應(yīng)用
廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸
如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于
AQS的。
10、線程的sleep()方法和yieldO方法有什么區(qū)別?
【僅供參考】
線程執(zhí)行sleep()方法后進入超時等待(TIMED」AITING)狀態(tài),而執(zhí)行
yieldO方法后進入就緒(READY)狀態(tài)。
sleepO方法給其他線程運行機會時不考慮線程的優(yōu)先級,因此會給低優(yōu)先級
的線程運行的機會;yieldO方法只會給相同優(yōu)先級或更高優(yōu)先級的線程以運
行的機會。
11、線程有哪些狀態(tài)?
【僅供參考】
線程的狀態(tài):
NEW尚未啟動
RUNNABLE正在執(zhí)行中
BLOCKED阻塞的(被同步鎖或者10鎖阻塞)
WAITING永久等待狀態(tài)
TIMEDJVAITING等待指定的時間重新被喚醒的狀態(tài)
TERMINATED執(zhí)行完成
12、在Java程序中怎么保證多線程的運行安全?
【僅供參考】
方法一:使用安全類,比如Java.util,concurrent下的類。
方法二:使用自動鎖synchronizedo
方法三:使用手動鎖Lock。
手動鎖Java示例代碼如下:
Locklock=newReentrantLockO;
lock,lock();
try(
System,out.printin("獲得鎖”);
}catch(Exceptione){
//TODO:handleexception
}finally{
System,out.printin("釋放鎖”);
lock,unlock0;
)
13、synchronized各種加鎖場景的作用范圍
【僅供參考】
1.作用于非靜態(tài)方法,鎖住的是對象實例(this),每一個對象實例有一個鎖。
publicsynchronizedvoidmethod(){}
2.作用于靜態(tài)方法,鎖住的是類的Class對象,因為Class的相關(guān)數(shù)據(jù)存儲在
永久代元空間,元空間是全局共享的,因此靜態(tài)方法鎖相當于類的一個全局
鎖,會鎖所有調(diào)用該方法的線程。
publicstaticsynchronizedvoidmethod(){}
3.作用于Lock.class,鎖住的是Lock的Class對象,也是全局只有一個。
synchronized(Lock,class){}
4.作用于this,鎖住的是對象實例,每一個對象實例有一個鎖。
synchronized(this){}
5.作用于靜態(tài)成員變量,鎖住的是該靜態(tài)成員變量對象,由于是靜態(tài)變量,因
此全局只有一個。
publicstaticObjectmonitor=newObject();synchronized(monitor)
{}
14、什么是CAS
【僅供參考】
CAS是compareandswap的縮寫,即我們所說的比較交換。
cas是一種基于鎖的操作,而且是樂觀鎖。在java中鎖分為樂觀鎖和悲觀
鎖。悲觀鎖是將資源鎖住,等一個之前獲得鎖的線程釋放鎖之后,下一個線程
才可以訪問。而樂觀鎖采取了一種寬泛的態(tài)度,通過某種方式不加鎖來處理資
源,比如通過給記錄加version來獲取數(shù)據(jù),性能較悲觀鎖有很大的提高。
CAS操作包含三個操作數(shù)一一內(nèi)存位置(V)、預(yù)期原值(A)和新值(B)。如
果內(nèi)存地址里面的值和A的值是一樣的,那么就將內(nèi)存里面的值更新成Bo
CAS是通過無限循環(huán)來獲取數(shù)據(jù)的,若果在第一輪循環(huán)中,a線程獲取地址里
面的值被b線程修改了,那么a線程需要自旋,到下次循環(huán)才有可能機會執(zhí)
行。
java.util.concurrent.atomic包下的類大多是使用CAS操作來
實現(xiàn)的
(Atomiclnteger,AtomicBoolean,AtomicLong)。
15、JavaConcurrencyAPI中的Lock接口(Lockinterface)是什么?對比
同步它有什么優(yōu)勢?
【僅供參考】
Lock接口比同步方法和同步塊提供了更具擴展性的鎖操作。他們允許更靈活的
結(jié)構(gòu),可以具有完全不同的性質(zhì),并且可以支持多個相關(guān)類的條件對象。
它的優(yōu)勢有:
(1)可以使鎖更公平
(2)可以使線程在等待鎖的時候響應(yīng)中斷
(3)可以讓線程嘗試獲取鎖,并在無法獲取鎖的時候立即返回或者等待一段
時間
(4)可以在不同的范圍,以不同的順序獲取和釋放鎖
16、JAVA兩種方式的動態(tài)代理?
【僅供參考】
JDK動態(tài)代理:利用反射機制生成一個實現(xiàn)代理接口的匿名類,在調(diào)用具體方
法前調(diào)用InvokeHandler來處理。
CGLIB動態(tài)代理:利用ASM(開源的Java字節(jié)碼編輯庫,操作字節(jié)碼)開源
包,將代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處
理。
區(qū)別:JDK代理只能對實現(xiàn)接口的類生成代理;CGlib是針對類實現(xiàn)代理,對指
定的類生成一個子類,并覆蓋其中的方法,這種通過繼承類的實現(xiàn)方式,不能
代理final修飾的類。
17^java反射的作用是什么?
【僅供參考】
反射機制是在運行時,對于任意一個類,都能夠知道這個類的所有屬性和方
法;對于任意個對象,都能夠調(diào)用它的任意一個方法。在java中,只要給定類
的名字,就可以通過反射機制來獲得類的所有信息。這種動態(tài)獲取的信息以及
動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。
18、說一下堆棧的區(qū)別?
【僅供參考】
功能方面:堆是用來存放對象的,棧是用來執(zhí)行程序的。
共享性:堆是線程共享的,棧是線程私有的。
空間大小:堆大小遠遠大于棧。
19、什么是雙親委派模型?
【僅供參考】
如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,
而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,
因此所有的加載請求最終都應(yīng)該傳送到頂層的啟動類加載器中,只有當父加載
器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,
子加載器才會嘗試自己去加載。
20、說一下JVM有哪些垃圾回收器?
【僅供參考】
Serial:最早的單線程串行垃圾回收器。
SerialOld:Serial垃圾回收器的老年版本,同樣也是單線程的,可以作為
CMS垃圾回收器的備選預(yù)案。
ParNew:是Serial的多線程版本。
Parallel和ParNew收集器類似是多線程的,但Parallel是吞吐量優(yōu)先的收
集器,可以犧牲等待時間換取系統(tǒng)的吞吐量。
ParallelOld是Parallel老生代版本,Parallel使用的是復(fù)制的內(nèi)存回收
算法,ParallelOld使用的是標記-整理的內(nèi)存回收算法。
CMS:一種以獲得最短停頓時間為目標的收集器,非常適用B/S系統(tǒng)。
G1:一種兼顧吞吐量和停頓時間的GC實現(xiàn),是JDK9以后的默認GC選項。
三、JavaWeb篇
1、常用HTTP狀態(tài)碼是怎么分類的?
【僅供參考】
狀態(tài)碼類別描述
Ixx信息狀態(tài)碼信息,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作
2xx成功狀態(tài)碼成功,操作被成功接收并處理
3xx重定向狀態(tài)碼重定向,需要進一步的操作以完成請求
4xx客戶端錯誤狀態(tài)碼客戶端錯誤,請求包含語法錯誤或無法完成請求
5xx服務(wù)器錯誤狀態(tài)碼服務(wù)器錯誤,服務(wù)器在處理請求的過程中發(fā)生了錯誤
HTTP1.0和HTTP1.1和HTTP2.0的區(qū)別
HTTP1.0:無狀態(tài),無連接
HTTP1.1:長連接,請求管道化,增加緩存處理,增加Host字段,支持斷點傳
輸
HTTP2.0:二進制分幀,多路復(fù)用(連接共享),頭部壓縮,服務(wù)器推送
2、三次握手和四次揮手
【僅供參考】
三次握手:
(1)客戶端向服務(wù)器發(fā)出連接請求等待服務(wù)器確認
(2)服務(wù)器向客戶端返回一個響應(yīng)告訴客戶端收到了請求
(3)客戶端向服務(wù)器再次發(fā)出確認信息,此時連接建立
四次揮手:
(1)客戶端向服務(wù)器發(fā)出取消連接請求
(2)服務(wù)器向客戶端返回一個響應(yīng),表示收到客戶端取消請求
(3)服務(wù)器向客戶端發(fā)出確認取消信息(向客戶端表明可以取消連接了)
(4)客戶端再次發(fā)送確認消息,此時連接取消
3、說一下tcp粘包是怎么產(chǎn)生的?
【僅供參考】
tcp粘包可能發(fā)生在發(fā)送端或者接收端,分別來看兩端各種產(chǎn)生粘包的原因:
發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;
接收方粘包:接收方不及時接收緩沖區(qū)的包,造成多個包接收。
4、http和https的基本概念
【僅供參考】
-HTTP:
是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個客戶端和服務(wù)器端請求
和應(yīng)答的標準(TCP),用于計算機之間傳輸文字,圖片,音頻,視頻等超文本
數(shù)據(jù)的協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少
-HTTPS:
是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入
SSL層,HTTPS的安全基礎(chǔ)是SSL,HTTPS就是從HTTP加上加密處理(一般是
SSL安全通信線路)+認證+完整性保護
-HTTPS協(xié)議的主要作用:
建立一個信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?/p>
確認網(wǎng)站的真實性
5、http響應(yīng)碼301和302代表的是什么?有什么區(qū)別?
【僅供參考】
301:永久重定向。
302:暫時重定向。
它們的區(qū)別是,301對搜索引擎優(yōu)化(SE0)更加有利;302有被提示為網(wǎng)絡(luò)攔
截的風險。
6、說一下JSP的4種作用域?
【僅供參考】
page:代表與一個頁面相關(guān)的對象和屬性。
request:代表與客戶端發(fā)出的一個請求相關(guān)的對象和屬性。一個請求可能跨越
多個頁面,涉及多個Web組件;需要在頁面顯示的臨時數(shù)據(jù)可以置于此作用
域。
session:代表與某個用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬性。跟某個
用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中。
application;代表與整個Web應(yīng)用程序相關(guān)的對象和屬性,它實質(zhì)上是跨越
整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個全局作用域。
7、什么是長連接和短連接
【僅供參考】
在HTTP/L0中默認使用短連接。也就是說,客戶端和服務(wù)器每進行一次HTTP
操作,就建立一次連
接,任務(wù)結(jié)束就中斷連接
而從HTTP/1.1起,默認使用長連接,用以保持連接特性。使用長連接的HTTP
協(xié)議,會在響應(yīng)頭加
入這行代碼:Connection:keep-alive
在使用長連接的情況下,當一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳
輸HTTP數(shù)據(jù)的TCP連
接不會關(guān)閉,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使用這一條已經(jīng)建立的連
接。Keep-Alive不會
永久保持連接,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中
設(shè)定這個時間。實現(xiàn)
長連接需要客戶端和服務(wù)端都支持長連接
8、forward和redirect的區(qū)別?
【僅供參考】
forward是轉(zhuǎn)發(fā)和redirect是重定向:
地址欄url顯示:fowardurl不會發(fā)生改變,redirecturl會發(fā)生改變;
數(shù)據(jù)共享:forward可以共享request里的數(shù)據(jù),redirect不能共享;
效率:forward比redirect效率高。
9、spring有哪些主要模塊?
【僅供參考】
springcore:框架的最基礎(chǔ)部分,提供ioc和依賴注入特性。
springcontext:構(gòu)建于core封裝包基礎(chǔ)上的context封裝包,提供了一種
框架式的對象訪問方法。
springdao:DataAccessObject提供了JDBC的抽象層。
springaop:提供了面向切面的編程實現(xiàn),讓你可以自定義攔截器、切點等。
springWeb:提供了針對Web開發(fā)的集成特性,例如文件上傳,利用servlet
listeners進行ioc容器初始化和針對Web的ApplicationContexto
springWebmvc:spring中的mvc封裝包提供了Web應(yīng)用的Model-View-
Controller(MVC)的實現(xiàn)。
10>說一下springmvc運行流程?
【僅供參考】
springmvc先將請求發(fā)送給DispatcherServleto
DispatcherServlet查詢一1個或多個HandlerMapping,找到處理請求的
Controller。
DispatcherServlet再把請求提交到對應(yīng)的Controller。
Controller進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView。
Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView
對象指定的視圖對象。
視圖對象負責渲染返回給客戶端。
11、SpringBoot的核心注解是哪個?它主要由哪幾個注解組成的?
【僅供參考】
啟動類上面的注解是@SpringBootApplication,它也是SpringBoot的核心注
解,主要組合包含了以下3個注解:
@SpringBootConfiguration:組合了?Configuration注解,實現(xiàn)配置文件的
功能。
@Enab1eAutoConfiguration:打開自動配置的功能,也可以關(guān)閉某個自動配置
的選項,如關(guān)閉數(shù)據(jù)源自動配置功能:
?SpringBootApplication(exclude=
{DataSourceAutoConfiguration.class})。
?ComponentScan:Spring組件掃描。
12、SpringBoot、SpringMVC和Spring有什么區(qū)別?
【僅供參考】
Spring:
Spring最重要的特征是依賴注入。所有SpringModules不是依賴注入就是
I0C控制反轉(zhuǎn)。
當我們恰當?shù)氖褂肈I或者是I0C的時候,我們可以開發(fā)松耦合應(yīng)用。松耦合
應(yīng)用的單元測試可以很容易的進行。
SpringMVC:
SpringMVC提供了一種分離式的方法來開發(fā)Web應(yīng)用。通過運用像
DispatcherServelet,MoudlAndView和ViewResolver等一些簡單的概念,開
發(fā)Web應(yīng)用將會變的非常簡單。
SpringBoot:
Spring和SpringMVC的問題在于需要配置大量的參數(shù)。
SpringBoot通過一個自動配置和啟動的項來目解決這個問題。為了更快的構(gòu)
建產(chǎn)品就緒應(yīng)用程序,SpringBoot提供了一些非功能性特征。
13>springboot讀取配置文件的方式
【僅供參考】
springboot默認讀取配置文件為application,properties或者是
application,yml
14、JPA和Hibernate有哪些區(qū)別?
【僅供參考】
簡而言之
JPA是一個規(guī)范或者接口
Hibernate是JPA的一個實現(xiàn)
當我們使用JPA的時候,我們使用javax.persistence包中的注釋和接口
時,不需要使用hibernate的導(dǎo)入包。
我們建議使用JPA注釋,因為哦我們沒有將其綁定到Hibernate作為實現(xiàn)。
后來(我知道-小于百分之一的幾率),我們可以使用另一種JPA實現(xiàn)。
15、SpringBoot還提供了其它的哪些StarterProjectOptions?
【僅供參考】
SpringBoot也提供了其它的啟動器項目包括,包括用于開發(fā)特定類型應(yīng)用程
序的典型依賴項。
spring-boot-starter-web-services-SOAPWebServices;
spring-boot-starter-web-Web和RESTful應(yīng)用程序;
spring-boot-starter-test-單元測試和集成測試;
spring-boot-starter-jdbc-傳統(tǒng)的JDBC;
spring-boot-starter-hateoas-為服務(wù)添加HATEOAS功能;
spring-boot-starter-security-使用SpringSecurity進行身份驗證和授
權(quán);
spring-boot-starter-data-jpa一帶有Hibeernate的SpringDataJPA;
spring-boot-starter-data-rest-使用SpringDataREST公布簡單的REST
服務(wù);
16、為什么我們需要spring-boot-maven-plugin?
【僅供參考】
spring-boot-maven-plugin提供了一些像jar一樣打包或者運行應(yīng)用程序的
命令。
1、spring-boot:run運行你的SpringBooty應(yīng)用程序。
2、spring-boot:repackage重新打包你的jar包或者是war包使其可執(zhí)
行
3、spring-boot:start和spring-boot:stop管理SpringBoot應(yīng)用程
序的生命周期(也可以說是為了集成測試)。
4、spring-boot:buiId-info生成執(zhí)行器可以使用的構(gòu)造信息。
17、開啟SpringBoot特性有哪幾種方式?
【僅供參考】
1)繼承spring-boot-starter-parent項目
2)導(dǎo)入spring-boot-dependencies項目依賴
18、MyBatis有哪些執(zhí)行器(Executor)?
【僅供參考】
MyBatis有三種基本的Executor執(zhí)行器:
SimpleExecutor:每執(zhí)行一次update或select就開啟一個Statement對
象,用完立刻關(guān)閉Statement對象;
ReuseExecutor:執(zhí)行update或select,以SQL作為key查找Statement
對象,存在就使用,不存在就創(chuàng)建,用完后不關(guān)閉Statement對象,而是放置
于Map內(nèi)供下一次使用。簡言之,就是重復(fù)使用Statement對象;
BatchExecutor:執(zhí)行update(沒有select,jdbc批處理不支持select),
將所有SQL都添加到批處理中(addBatch。),等待統(tǒng)一執(zhí)行
(executeBatch()),它緩存了多個Statement對象,每個Statement對象都
是addBatch()完畢后,等待逐一執(zhí)行executeBatch。批處理,與jdbc批處
理相同。
19、為什么要使用hibernate?
【僅供參考】
hibernate是對jdbc的封裝,大大簡化了數(shù)據(jù)訪問層的繁瑣的重復(fù)性代碼。
hibernate是一個優(yōu)秀的ORM實現(xiàn),很多程度上簡化了DA0層的編碼功能。
可以很方便的進行數(shù)據(jù)庫的移植工作。
提供了緩存機制,是程序執(zhí)行更改的高效。
20、hibernate實體類必須要有無參構(gòu)造函數(shù)嗎?為什么?
【僅供參考】
hibernate中每個實體類必須提供一個無參構(gòu)造函數(shù),因為hibernate框架要
使用reflectionapi,通過調(diào)用Classnewlnstance()來創(chuàng)建實體類的實例,
如果沒有無參的構(gòu)造函數(shù)就會拋出異常。
四、Java數(shù)據(jù)緩存,消息隊列篇
1、RabbitMQ集群中唯一一個磁盤節(jié)點崩潰了會發(fā)生什么情況?
【僅供參考】
如果唯一磁盤的磁盤節(jié)點崩潰了,不能進行以下操作:
不能創(chuàng)建隊列
不能創(chuàng)建交換器
不能創(chuàng)建綁定
不能添加用戶
不能更改權(quán)限
不能添加和刪除集群節(jié)點
唯一磁盤節(jié)點崩潰了,集群是可以保持運行的,但你不能更改任何東西。
2、RabbitMQ有哪些重要的角色?
【僅供參考】
RabbitMQ中重要的角色有:生產(chǎn)者、消費者和代理:
生產(chǎn)者:消息的創(chuàng)建者,負責創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器;
消費者:消息的接收方,用于處理數(shù)據(jù)和確認消息;
代理:就是RabbitMQ本身,用于扮演“快遞”的角色,本身不生產(chǎn)消息,只
是扮演“快遞”的角色。
3、RabbitMQ的使用場景有哪些?
【僅供參考】
搶購活動,削峰填谷,防止系統(tǒng)崩塌。
延遲信息處理,比如10分鐘之后給下單未付款的用戶發(fā)送郵件提醒。
解耦系統(tǒng),對于新增的功能可以單獨寫模塊擴展,比如用戶確認評價之后,新
增了給用戶返積分的功能,這個時候不用在業(yè)務(wù)代碼里添加新增積分的功能,
只需要把新增積分的接口訂閱確認評價的消息隊列即可,后面再添加任何功能
只需要訂閱對應(yīng)的消息隊列即可。
4、RabbitMQ的消息是怎么發(fā)送的?
【僅供參考】
首先客戶端必須連接到RabbitMQ服務(wù)器才能發(fā)布和消費消息,客戶端和
rabbitserver之間會創(chuàng)建一個tcp連接,一旦tcp打開并通過了認證(認
證就是你發(fā)送給rabbit服務(wù)器的用戶名和密碼),你的客戶端和RabbitMQ就
創(chuàng)建了一條amqp信道(channel),信道是創(chuàng)建在“真實”tcp上的虛擬連
接,amqp命令都是通過信道發(fā)送出去的,每個信道都會有一個唯一的id,不
論是發(fā)布消息,訂閱隊列都是通過這個信道完成的。
5、RabbitMQ怎么避免消息丟失?
【僅供參考】
把消息持久化磁盤,保證服務(wù)器重啟消息不丟失。
每個集群中至少有一個物理磁盤,保證消息落入磁盤。
6、zookeeper怎么保證主從節(jié)點的狀態(tài)同步?
【僅供參考】
zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實
現(xiàn)這個機制的協(xié)議叫做zab協(xié)議。zab協(xié)議有兩種模式,分別是恢復(fù)模式(選
主)和廣播模式(同步)。當服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后,zab就進入了恢復(fù)
模式,當領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)server完成了和leader的狀態(tài)同步
以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和server具有相同的系
統(tǒng)狀態(tài)。
7^kafkaproducer如何優(yōu)化打入速度?
【僅供參考】
增加線程
提高batch,size
增加更多producer實例
增加partition數(shù)
設(shè)置acks=~l時,如果延遲增大:可以增大num.replica,fetchers(follower
同步數(shù)據(jù)的線程數(shù))來調(diào)解;
跨數(shù)據(jù)中心的傳輸:增加socket緩沖區(qū)設(shè)置以及OStcp緩沖區(qū)設(shè)置。
8、使用kafka集群需要注意什么?
【僅供參考】
集群的數(shù)量不是越多越好,最好不要超過7個,因為節(jié)點越多,消息復(fù)制需要
的時間就越長,整個群組的吞吐量就越低。
集群數(shù)量最好是單數(shù),因為超過一半故障集群就不能用了,設(shè)置為單數(shù)容錯率
更高。
9、集群中有3臺服務(wù)器,其中一個節(jié)點宕機,這個時候zookeeper還可以
使用嗎?
【僅供參考】
可以繼續(xù)使用,單數(shù)服務(wù)器只要沒超過一半的服務(wù)器宕機就可以繼續(xù)使用。
10、kafka中的broker是干什么的?
【僅供參考】
broker是消息的代理,Producers往Brokers里面的指定Topic中寫消息,
Consumers從Brokers里面拉取指定Topic的消息,然后進行業(yè)務(wù)處理,
broker在中間起到一個代理保存消息的中轉(zhuǎn)站。
11、說一下zookeeper的通知機制?
【僅供參考】
客戶端端會對某個znode建立一個watcher事件,當該znode發(fā)生變化時,
這些客戶端會收到zookeeper的通知,然后客戶端可以根據(jù)znode變化來做
出業(yè)務(wù)上的改變。
12>當你使用kafka-topics.sh創(chuàng)建(刪除)了一個topic之后,Kafka背后會
執(zhí)行什么邏輯?
【僅供參考】
1)會在zookeeper中的/brokers/topics節(jié)點下創(chuàng)建一個新的topic節(jié)點,
如:/brokers/topics/first
2)觸發(fā)Controller的監(jiān)聽程序
3)kafkaController負責topic的創(chuàng)建工作,并更新metadatacache
13、什么情況會導(dǎo)致kafka運行變慢?
【僅供參考】
cpu性能瓶頸
磁盤讀寫瓶頸
網(wǎng)絡(luò)瓶頸
14、Redis持久化有幾種方式?
【僅供參考】
Redis的持久化有兩種方式,或者說有兩種策略:
RDB(RedisDatabase):指定的時間間隔能對你的數(shù)據(jù)進行快照存儲。
AOF(AppendOnlyFile):每一個收到的寫命令都通過write函數(shù)追加到文件
中。
15、Redis有哪些功能?
【僅供參考】
數(shù)據(jù)緩存功能
分布式鎖的功能
支持數(shù)據(jù)持久化
支持事務(wù)
支持消息隊列
16、怎么保證緩存和數(shù)據(jù)庫數(shù)據(jù)的一致性?
【僅供參考】
合理設(shè)置緩存的過期時間。
新增、更改、刪除數(shù)據(jù)庫操作時同步更新Redis,可以使用事物機制來保證數(shù)
據(jù)的一致性。
17、Redis和memcache有什么區(qū)別?
【僅供參考】
存儲方式不同:memcache把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會掛掉,數(shù)據(jù)不能
超過內(nèi)存大?。籖edis有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性。
數(shù)據(jù)支持類型:memcache對數(shù)據(jù)類型支持相對簡單;Redis有復(fù)雜的數(shù)據(jù)類
型。
使用底層模型不同:它們之間底層實現(xiàn)方式,以及與客戶端之間通信的應(yīng)用協(xié)
議不一樣,Redis自己構(gòu)建了vm機制,因為一般的系統(tǒng)調(diào)用系統(tǒng)函數(shù)的話,
會浪費一定的時間去移動和請求。
value值大小不同:Redis最大可以達到512mb;memcache只有Imbo
18、Redis為什么是單線程的?
【僅供參考】
因為cpu不是Redis的瓶頸,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶
寬。既然單線程容易實現(xiàn),而且cpu又不會成為瓶頸,那就順理成章地采用單
線程的方案了。
關(guān)于Redis的性能,官方網(wǎng)站也有,普通筆記本輕松處理每秒幾十萬的請求。
而且單線程并不代表就慢nginx和nodejs也都是高性能單線程的代表。
19、Redis怎么實現(xiàn)分布式鎖?
【僅供參考】
Redis分布式鎖其實就是在系統(tǒng)里面占一個“坑”,其他程序也要占“坑”的
時候,占用成功了就可以繼續(xù)執(zhí)行,失敗了就只能放棄或稍后重試。
占坑一般使用setnx(setifnotexists)指令,只允許被一個程序占有,使用
完調(diào)用del釋放鎖。
20、Redis是什么?都有哪些使用場景?
【僅供參考】
Redis是一個使用C語言開發(fā)的高速緩存數(shù)據(jù)庫。
Redis使用場景:
記錄帖子點贊數(shù)、點擊數(shù)、評論數(shù);
緩存近期熱帖;
緩存文章詳情信息;
記錄用戶會話信息。
五、MySQL篇
1、char和varchar的區(qū)別是什么?
【僅供參考】
rchar(n)]:固定長度類型,比如訂閱char(10),當你輸入〃abc〃三個字符
的時候,它們占的空間還是10個字節(jié),其他7個是空字節(jié)。
chat優(yōu)點:效率高;缺點:占用空間;適用場景:存儲密碼的md5值,固定
長度的,使用char非常合適。
「varchar(n)」:可變長度,存儲的值是每個值占用的字節(jié)再加上一個用來記
錄其長度的字節(jié)的長度。
所以,從空間上考慮varcahr比較合適;從效率上考慮char比較合適,二者
使用需要權(quán)衡。
2、說一下MySQL的行鎖和表鎖?
【僅供參考】
MylSAM只支持表鎖,InnoDB支持表鎖和行鎖,默認為行鎖。
表級鎖:開銷小,加鎖快,不會出現(xiàn)死鎖。鎖定粒度大,發(fā)生鎖沖突的概率最
高,并發(fā)量最低。
行級鎖:開銷大,加鎖慢,會出現(xiàn)死鎖。鎖力度小,發(fā)生鎖沖突的概率小,并
發(fā)度最高。
3、說一下MySQL常用的引擎?
【僅供參考】
InnoDB引擎:mysql5.1后默認的數(shù)據(jù)庫引擎,提供了對數(shù)據(jù)庫acid事務(wù)的
支持,并且還提供了行級鎖和外鍵的約束,它的設(shè)計的目標就是處理大數(shù)據(jù)容
量的數(shù)據(jù)庫系統(tǒng)。MySQL運行的時候,InnoDB會在內(nèi)存中建立緩沖池,用于緩
沖數(shù)據(jù)和索引。但是該引擎是不支持全文搜索,同時啟動也比較的慢,它是不
會保存表的行數(shù)的,所以當進行selectcount(*)fromtable指令的時候,
需要進行掃描全表。由于鎖的粒度小,寫操作是不會鎖定全表的,所以在并發(fā)度
較高的場景下使用會提升效率的。
MylASM引擎:不提供事務(wù)的支持,也不支持行級鎖和外鍵。因此當執(zhí)行插入和
更新語句時,即執(zhí)行寫操作的時候需要鎖定這個表,所以會導(dǎo)致效率會降低。
不過和InnoDB不同的是,MylASM引擎是保存了表的行數(shù),于是當進行
selectcount(*)fromtable語句時,可以直接的讀取已經(jīng)保存的值而不需要
進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務(wù)的
支持的,可以將MylASM作為數(shù)據(jù)庫引擎的首選。
4、MySQL是如何保證主備同步?
【僅供參考】
主備關(guān)系的建立:
一開始創(chuàng)建主備關(guān)系的時候,是由備庫指定的,比如基于位點的主備關(guān)系,備
庫說“我要從binlog文件A的位置P”開始同步,主庫就從這個指定的位置開
始往后發(fā)。
而主備關(guān)系搭建之后,是主庫決定要發(fā)給數(shù)據(jù)給備庫的,所以主庫有新的日志
也會發(fā)給備庫。
MySQL主備切換流程:
客戶端讀寫都是直接訪問A,而節(jié)點B是備庫,只要將A的更新都同步過來,
到本地執(zhí)行就可以保證數(shù)據(jù)是相同的。
當需要切換的時候就把節(jié)點換一下,A的節(jié)點B的備庫
一個事務(wù)完整的同步過程:
備庫B和主庫A建立來了長鏈接,主庫A內(nèi)部專門線程用于維護了這個長鏈
接。
在備庫B上通過changemaster命令設(shè)置主庫A的IP端口用戶名密碼以及從哪
個位置開始請求binlog包括文件名和日志偏移量
在備庫B上執(zhí)行start-slave命令備庫會啟動兩個線程:io_lhread和
sqljhread分別負責建立連接和讀取中轉(zhuǎn)日志進行解析執(zhí)行
備庫讀取主庫傳過來的binlog文件備庫收到文件寫到本地成為中轉(zhuǎn)日志
后來由于多線程復(fù)制方案的引入,sql_thread演化成了多個線程。
5、什么是WAL技術(shù),有什么優(yōu)點?
【僅供參考】
WAL,中文全稱是Write-AheadLogging,它的關(guān)鍵點就是日志先寫內(nèi)存,再寫
磁盤。MySQL執(zhí)行更新操作后,在真正把數(shù)據(jù)寫入到磁盤前,先記錄日志。
好處是不用每一次操作都實時把數(shù)據(jù)寫盤,就算crash后也可以通過redo
log恢復(fù),所以能夠?qū)崿F(xiàn)快速響應(yīng)SQL語句。
6、Xid在MySQL內(nèi)部是怎么生成的呢?
【僅供參考】
MySQL內(nèi)部維護了一個全局變量global_query_id,每次執(zhí)行語句(包括
select語句)的時候?qū)⑺x值給Query_id,然后給這個變量加1。如果當前
語句是這個事務(wù)執(zhí)行的第一條語句,那么MySQL還會同時把Query_id賦值給
這個事務(wù)的Xido
而global_query_id是一個純內(nèi)存變量,重啟之后就清零了。所以你就知道
了,在同一個數(shù)據(jù)庫實例中,不同事務(wù)的Xid也是有可能相同的。但是MySQL
重啟之后會重新生成新的binlog文件,這就保證了,同一個binlog文件
里,Xid一定是惟一的。
7、索引的常見類型以及它是如何發(fā)揮作用的?
【僅供參考】
根據(jù)葉子節(jié)點的內(nèi)容,索引類型分為主鍵索引和非主鍵索引。
主鍵索引的葉子節(jié)點存的整行數(shù)據(jù),在InnoDB里也被稱為聚簇索引。
非主鍵索引葉子節(jié)點存的主鍵的值,在InnoDB里也被稱為二級索引。
8、短時間提高MySQL性能的方法?
【僅供參考】
第一種方法:先處理掉那些占著連接但是不工作的線程。或者再考慮斷開事務(wù)
內(nèi)空閑太久的連接。killconnection+id
第二種方法:減少連接過程的消耗:慢查詢性能問題在MySQL中,會引發(fā)性能
問題的慢查詢,大體有以下三種可能:索引沒有設(shè)計好;SQL語句沒寫好;
MySQL選錯了索引(forceindex)。
9、MySQL是如何保證數(shù)據(jù)不丟失的?
【僅供參考】
只要redolog和binlog保證持久化磁盤就能確保MySQL異常重啟后回復(fù)數(shù)據(jù)
在恢復(fù)數(shù)據(jù)時,redolog狀態(tài)為commit則說明binlog也成功,直接恢復(fù)數(shù)
據(jù);如果redolog是prepare,則需要查詢對應(yīng)的binlog事務(wù)是否成功,決
定是回滾還是執(zhí)行。
10、count(*)實現(xiàn)方式以及各種count對比
【僅供參考】
對于count(主鍵id)來說,InnoDB引擎會遍歷整張表,把每一行的id值都
取出來,返回給server層。server層拿到id后,判斷是不可能為空的,就
按行累加。
對于count(1)來說,InnoDB引擎遍歷整張表,但不取值。server層對于返
回的每一行,放一個數(shù)字“1”進去,判斷是不可能為空的,按行累加。單看這
兩個用法的差別的話,你能對比出來,count(1)執(zhí)行得要比count(主鍵id)
快。因為從引擎返回id會涉及到解析數(shù)據(jù)行,以及拷貝字段值的操作。
對于count(字段)來說:如果這個“字段”是定義為notnull的話,一行行
地從記錄里面讀出這個字段,判斷不能為null,按行累加;如果這個“字段”
定義允許為null,那么執(zhí)行的時候,判斷到有可能是null,還要把值取出來
再判斷一下,不是null才累加。也就是前面的第一條原則,server層要什么
字段,InnoDB就返回什么字段。
但是count*是例外,并不會把全部字段取出來,而是專門做了優(yōu)化,不取
值。count(*)肯定不是null,按行累加。
所以結(jié)論是:按照效率排序的話,count(字段)〈count(主鍵
id)〈count(1)—count(X),所以建議盡量使用count(*)0
11、說一下數(shù)據(jù)庫的事務(wù)隔離?
【僅供參考】
MySQL的事務(wù)隔離是在MySQL,ini配置文件里添加的,在文件的最后添加:
?transaction-isolation=REPEATABLE-READ
99
可用的配置值:READ-UNCOMMITTED,READ-COMMITTED.REPEATABLE-READ.
SERIALIZABLEo
READ-UNCOMM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度融資租賃項目咨詢合同2篇
- 2024葡萄酒產(chǎn)區(qū)旅游與銷售一體合同3篇
- 二零二五年度企業(yè)內(nèi)部控制體系建設(shè)與財務(wù)顧問服務(wù)合同樣本3篇
- 藝術(shù)體操系統(tǒng)課程設(shè)計
- 二零二五年抖音平臺主播作品版權(quán)合同3篇
- 物聯(lián)網(wǎng)數(shù)據(jù)存儲課程設(shè)計
- 二零二五年度展覽館場地租賃合同6篇
- 電氣元件生產(chǎn)建設(shè)項目可行性研究報告申請立項備案
- 2024離婚冷靜期婚姻家庭財產(chǎn)分割與子女撫養(yǎng)權(quán)協(xié)商服務(wù)合同3篇
- 黑色金屬礦采選業(yè)市場前景及投資研究報告
- 《新概念英語第二冊》電子書、單詞、筆記、練習(xí)冊(附答案)匯編
- 2023年云南大學(xué)滇池學(xué)院招聘考試真題
- 第二章 新聞評論中的觀點
- 2023-2024學(xué)年湖南省長沙市雨花區(qū)外研版(三起)五年級上冊期末質(zhì)量檢測英語試卷
- SAP財務(wù)操作說明
- 會議室設(shè)備安裝培訓(xùn)課件
- 檢驗科培訓(xùn)課件
- 視頻剪輯師工作總結(jié)
- 管溝開挖教學(xué)課件
- 催收公司管理制度
- 房屋托管培訓(xùn)課件
評論
0/150
提交評論