**十一、Mybatis用到的設計模式:
工廠模式:SqlSessionFacoty
構建者模式:SqlSessionFactory Builder構建SqlSession工廠
代理模式:使用了JDK動態(tài)代理
單例模式:向configuration這個配置里面都是單例的(配置信息)
**十二、微服務(SpringCloud)
springcloud的應用微服務的一個實現(xiàn)框架之一, Spring Cloud 是一系列框架的集合。利用Spring Boot 開發(fā)簡化了分布式系統(tǒng)的開發(fā),如服務發(fā)現(xiàn)與注冊、配置中心、消息總線、負載均衡、斷路器、數(shù)據(jù)監(jiān)控;Spring Cloud 講各公司成熟經(jīng)得起考驗的框架組合起來,最終開發(fā)出一套簡單易懂、易部署和易維護的分布式系統(tǒng)開發(fā)工具。
SpringBoot 專注于快速方便的開發(fā)單個個體微服務;而SpringCloud關注全局微服務協(xié)調(diào)整理治理框架,它將SpringBoot開發(fā)的一個個單體微服務整合并管理起來,為各個微服務之間提供配置管理、服務發(fā)現(xiàn)、斷路器、路由、事件總線、分布式系統(tǒng)、等等集成服務??偟膩碚f:SpringBoot專注于快捷、方便的開發(fā)單個微服務個體、SpringCloud關注全局的服務治理組件的集合。
springcloud五大組件:1、Eureka實現(xiàn)服務治理;2、Ribbon主要提供客戶側(cè)的軟件負載均衡算法;3、Hystrix斷路器,保護系統(tǒng),控制故障范圍;4、Zuul,api網(wǎng)關,路由,負載均衡等多種作用;5、Config配置管理。其中除了config都是Netflix的。
目前五大組件,部分逐漸被替換
Eureka:注冊中心 —> Nacos(阿里)
Zuul:服務網(wǎng)關 —>GetWay
Ribbon:負載均衡
Feign:服務調(diào)用 –>OpenFeign
Hystix:熔斷器 –> Sentinel (阿里)
Config: 配置中心—> Nacos(阿里)
**十三、Nacose與Eureka區(qū)別



健康檢查:通過心跳來維持,客戶端端每隔5秒發(fā)送一個心跳包,告訴注冊中心自己還活著,超過30秒沒有收到心跳,直接剔除該實例
拉取服務:客戶端會向注冊中心定時拉去服務(每隔30s)
**十四、Zuul與GateWay網(wǎng)關
網(wǎng)關的作用,其實就是對所有微服務的保護
統(tǒng)一入口,作為微服務框架下的對外門戶
解耦:后端服務可以獨立擴展、部署、修改
安全性:進行身份認證
路由轉(zhuǎn)發(fā)
負載均衡
限流
GateWay:
優(yōu)點
是Spring家族中的一員,可以無縫集成到SpringCloud中與其他Spring組件協(xié)同工作
采用了響應式編程模型,可以更好的處理大規(guī)模并發(fā)請求
缺點:
- 是一個年輕的項目,在某些方面缺乏成熟性和穩(wěn)定性
Zuul:
優(yōu)點:
是Netflix下的組件,由于應用比較早,具有較高的穩(wěn)定性
提供簡單易用的配置和擴張機制,開發(fā)人員可以快速上手
缺點:
不支持響應式編程,處理高并發(fā)的情況下,性能較差
2.0后已經(jīng)不開源了
目前由于zuul的閉源,SpringCloud生態(tài)下逐步去netflix生態(tài)化,使的gateWay逐步被企業(yè)采用
**十五、JVM
Jvm是java虛擬機,java的運行環(huán)境,jvm實現(xiàn)了java一次編譯,處處運行。JVM只需要保證能夠正確執(zhí)行.class文件,就可以運行在諸如Linux、Windows、MacOS等平臺上了

堆、方法區(qū):線程共享
本地方法棧、虛擬機棧、程序計數(shù)器線程私有
堆:用于存放java對象實例、數(shù)組等數(shù)據(jù)。可以通過Xmx、Xms設置堆內(nèi)存的大小
方法區(qū):1.8中只是個概念上的東西,元空間是方法區(qū)的實現(xiàn),主要存放類的元數(shù)據(jù)信息,加載的類型信息,常量,靜態(tài)變量,即時編譯器編譯后的代碼緩存等數(shù)據(jù)
類型信息:class、interface、enum、annotation
程序計數(shù)器:記錄每個線程當前執(zhí)行jvm指令的地址指針
本地方法棧:為虛擬機使用本地native方法服務的,是指調(diào)用非java的方法,比如c、c++方法
虛擬機棧:描述java方法線程執(zhí)行線程私有區(qū)域,每個java方法執(zhí)行都會創(chuàng)建一個棧楨。局部變量、操作數(shù)棧、動態(tài)鏈接、方法出口等,Xss設置大小
元空間:永久代導致內(nèi)存溢出,頻繁垃圾回收,元空間不在受限jvm可用內(nèi)存限制,而是由操作系統(tǒng)的可用內(nèi)存限制,使得java程序可以處理更大的類,更大的對象,而不會出現(xiàn)永久代的內(nèi)存溢出問題。
元空間:
解決永久代內(nèi)存受限的問題
元空間使用了堆外內(nèi)存,避免了jvm堆內(nèi)存的復制和移動操作,提高程序的性能
元空間的大小不受jvm內(nèi)存的限制,可以更好的利用操作系統(tǒng)的內(nèi)存資源
元空間由java本地接口(JNI)負責管理,使得java開發(fā)人員更好的控制類元數(shù)據(jù)的創(chuàng)建和銷毀
年輕代:采用標記復制算法 分Eden、Survivor0、Survivor1,內(nèi)存占比:8:1:1
老年代:采用標記清除算法
堆內(nèi)存: 默認為物理內(nèi)存的1/64(小于1GB),其中年輕代與年老代所占內(nèi)存比值為1:4
**十六、GC算法
標記清除算法:給存活的對象打上標記,沒有標記的對象全部被回收
標記復制算法:把內(nèi)存為兩等份,每次只使用其中一等份,等正在使用的這一等份內(nèi)存滿了,它就會把標記存活的對象拷貝到另一份閑置的內(nèi)存中,被留在開始的一份內(nèi)存中對象被垃圾回收,開始閑置的內(nèi)存變成正在使用的狀態(tài),被垃圾回收的內(nèi)存就會閑置出來。
標記整理算法---將標記的對象整理到另一端,沒有標記的對象可以被覆蓋或回收
年輕代:采用標記復制算法。主要是因為年輕代存活幾率不大
老年代:采用標記清除算法
GC采用的可達性分析法來判斷對象是不是存活(GCRoot)
**十七、JVM中類加載機制
Bootstrap ClassLoader :引導類加載器
Extension ClassLoader:擴展類加載器
Application ClassLoader:系統(tǒng)類加載器
**十八、JVM雙親委派機制
加載某個類的class文件時,不會自己先加載,而是把這個請求委托給父類加載器執(zhí)行,如果父類加載器存在父類加載器,則進一步向上委托,依次遞歸,最終將到達頂層的啟動類加載器。如果父類加載器不能完成加載,就會自己加載。
**十九、JVM調(diào)優(yōu)
調(diào)優(yōu)的最終目的都是為了令應用程序使用最小的硬件消耗來承載更大的吞吐。jvm調(diào)優(yōu)主要是針對垃圾收集器的收集性能優(yōu)化,令運行在虛擬機上的應用能夠使用更少的內(nèi)存以及延遲獲取更大的吞吐量。
JVM調(diào)優(yōu)時,我們要遵循一些原則:
1.大多數(shù)的Java應用不需要進行JVM優(yōu)化;
2.大多數(shù)導致GC問題的原因是代碼層面的問題導致的(代碼層面);
3.上線之前,應先考慮將機器的JVM參數(shù)設置到最優(yōu);
4.減少創(chuàng)建對象的數(shù)量(代碼層面);
5.減少使用全局變量和大對象(代碼層面);
6.優(yōu)先架構調(diào)優(yōu)和代碼調(diào)優(yōu),JVM優(yōu)化是不得已的手段(代碼、架構層面);
7.分析GC情況優(yōu)化代碼比優(yōu)化JVM參數(shù)更好(代碼層面);
通過以上原則,我們發(fā)現(xiàn),其實最有效的優(yōu)化手段是架構和代碼層面的優(yōu)化,而JVM優(yōu)化則是最后不得已的手段,也可以說是對服務器配置的最后一次“壓榨”。
下面展示了一些JVM調(diào)優(yōu)的量化目標參考實例:
Heap 內(nèi)存使用率 <= 70%;
Old generation內(nèi)存使用率<= 70%;
avgpause <= 1秒;
Full gc 次數(shù)0 或 avg pause interval >= 24小時 ;
-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
參數(shù)解析及調(diào)優(yōu)

-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
參數(shù)解析:
-Xmx4g:堆內(nèi)存最大值為4GB。
-Xms4g:初始化堆內(nèi)存大小為4GB。
-Xmn1200m:設置年輕代大小為1200MB。增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss512k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1MB,以前每個線程堆棧大小為256K。應根據(jù)應用線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=8:設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設置為8,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:8,一個Survivor區(qū)占整個年輕代的1/10
-XX:PermSize=100m:初始化永久代大小為100MB。
-XX:MaxPermSize=256m:設置持久代大小為256MB。
-XX:MaxTenuringThreshold=15:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
**二十、Spring事務隔離級別
1、Read Uncommitted(讀未提交):一個事務可以操作另外一個未提交的事務,不能避免臟讀,不可重復讀,幻讀,隔離級別最低
2、Read Committed(讀已提交):一個事務不可以操作另外一個未提交的事務, 能防止臟讀,不能避免不可重復讀,幻讀。Oracle默認隔離級別
3、Repeatable Read(可重復讀):保證一個事務多次讀到的數(shù)據(jù)是沒有變化的。MySQL的默認隔離級別。
4、Serializable(串行化):一個事務執(zhí)行完后,另一個事務才能執(zhí)行。最嚴格的級別
臟讀:讀取到了別的事務回滾前的數(shù)據(jù),例如事務1修改某值,事務2讀取該值,后面事務1放棄此次修改,導致事務2讀取該值的數(shù)據(jù)是無效的。
不可重復讀:一個事務在兩次讀取同一個數(shù)據(jù)的值不一致。例如A事務讀取X,在中間過程中B事務修改了X的值,事務A再次讀取X時值發(fā)生了改變。
幻讀:查詢得到的數(shù)據(jù)條數(shù)發(fā)生了改變,例如A事務搜索數(shù)據(jù)時有10條數(shù)據(jù),在這時B事務插入了一條數(shù)據(jù),A事務再搜索時發(fā)現(xiàn)數(shù)據(jù)有11條了。