1.spring IOC/AOP/MVC
? spring是一個(gè)輕量級(jí)框架隧饼,IOC控制反轉(zhuǎn)降低耦合度鹏秋,AOP可以把應(yīng)用業(yè)務(wù)和系統(tǒng)服務(wù)分開干毅,MVC是一個(gè)非常常用的WEB框架循未。
? IOC:
控制反轉(zhuǎn)是一種在軟件工程中解耦合的思想岸浑,調(diào)用類只依賴接口搏存,而不依賴具體的實(shí)現(xiàn)類,減少了耦合矢洲。
控制權(quán)交給了容器璧眠,在運(yùn)行的時(shí)候才由容器決定將具體的實(shí)現(xiàn)動(dòng)態(tài)的“注入”到調(diào)用類的對(duì)象中。
原先我們要使用一個(gè)類的方法读虏,需要new一個(gè)對(duì)象责静,然后再用這個(gè)對(duì)象去調(diào)方法,但是項(xiàng)目中類太多了盖桥,每個(gè)都去new很麻煩灾螃。
? ? 用IOC的話,把我們自己需要實(shí)例化的對(duì)象交給spring處理揩徊,這個(gè)時(shí)候?qū)嵗瘜?duì)象的權(quán)利就被spring所擁有腰鬼,這個(gè)過程就是控制反轉(zhuǎn)。
IOC是目的塑荒,DI是手段熄赡,DI可以作為IOC的一種實(shí)現(xiàn)方式。
? AOP:
面向切面編程齿税,實(shí)現(xiàn)一些與業(yè)務(wù)無關(guān)的功能彼硫,例如:異常處理、日志記錄凌箕。
AOP代理就是AOP框架通過代理模式創(chuàng)建的對(duì)象拧篮,Spring使用JDK動(dòng)態(tài)代理或CGLIB代理來實(shí)現(xiàn),Spring缺省使用JDK動(dòng)態(tài)代理來實(shí)現(xiàn)牵舱,
從而任何接口都可別代理串绩,如果被代理的對(duì)象實(shí)現(xiàn)不是接口將默認(rèn)使用CGLIB代理,不過CGLIB代理當(dāng)然也可應(yīng)用到接口仆葡。
AOP代理的目的就是將切面織入到目標(biāo)對(duì)象
? MVC:DispatcherServlet-->HandlerMapping-->HandlerAdapter-->ModelAndView-->ViewResolver
? 用到的設(shè)計(jì)模式:
1.工廠模式:Spring中的FactoryBean就是典型的工廠方法模式
2.策略模式:定義一系列的算法赏参,把它們一個(gè)個(gè)封裝起來志笼,并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化(SimpleInstantiationStrategy)
3.模板模式:JdbcTemplate執(zhí)行execute方法
4.單例模式:spring的BeanFactory
5.適配器模式:Spring中用到的包裝器模式在類名上有兩種表現(xiàn):一種是類名中含有Wrapper把篓,另一種是類名中含有Decorator纫溃。
? 基本上都是動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)
6.代理模式:Spring的Proxy模式在aop中有體現(xiàn),比如JdkDynamicAopProxy和Cglib2AopProxy
7.觀察者模式:Spring中Observer模式常用的地方是listener的實(shí)現(xiàn)韧掩。如ApplicationListener;
2.內(nèi)存模型/JVM/GC
? 計(jì)算機(jī)的內(nèi)存模型是: cup通過寄存器訪問高速緩存然后再訪問內(nèi)存
? Java的內(nèi)存模型JMM:
JMM定義了線程和主內(nèi)存之間的抽象關(guān)系:線程之間的共享變量存儲(chǔ)在主內(nèi)存(main memory)中紊浩,
每個(gè)線程都有一個(gè)私有的本地內(nèi)存(local memory),本地內(nèi)存中存儲(chǔ)了該線程以讀/寫共享變量的副本疗锐。
本地內(nèi)存是JMM的一個(gè)抽象概念坊谁,并不真實(shí)存在。它涵蓋了緩存滑臊,寫緩沖區(qū)口芍,寄存器以及其他的硬件和編譯器優(yōu)化。
? JVM:
主要包括:虛擬機(jī)棧雇卷、方法區(qū)鬓椭、堆、本地方法棧关划、程序計(jì)數(shù)器
1小染、程序計(jì)數(shù)器:可以看成是當(dāng)前線程執(zhí)行的字節(jié)碼的行號(hào)指示器。字節(jié)碼解釋器工作時(shí)贮折,就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一步要執(zhí)行的字節(jié)碼指令裤翩,分支、循環(huán)调榄、跳轉(zhuǎn)踊赠、異常
? 等都要依賴這個(gè)計(jì)數(shù)器。
2振峻、Java虛擬機(jī)棧:是線程私有的臼疫,他的生命周期和線程相同择份。
? 它是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量扣孟、操作數(shù)棧、動(dòng)態(tài)鏈接荣赶、方法出口等信息凤价。
3、本地方法棧則為虛擬機(jī)棧使用到的Native方法服務(wù)
4拔创、堆:
? 是所有線程共享的內(nèi)存區(qū)域利诺,在虛擬機(jī)創(chuàng)建時(shí)創(chuàng)建∈T铮可以分為新生代慢逾、老年代立倍、永久代,侣滩。
? 新生代:大多數(shù)對(duì)象在新生代中被創(chuàng)建口注,其中很多對(duì)象的生命周期很短.又可以分為Eden空間,survivor from/to 占比為8:1:1
? Java8中去掉了老年代君珠、增加了元空間寝志。
5、方法區(qū):
? 也是各個(gè)線程共享的內(nèi)存區(qū)域策添,用于存儲(chǔ)已被虛擬機(jī)加載的類信息材部、常量、靜態(tài)變量唯竹,即時(shí)編譯器編譯的代碼等數(shù)據(jù)乐导。
Xms 是指設(shè)定程序啟動(dòng)時(shí)占用內(nèi)存大小。一般來講浸颓,大點(diǎn)兽叮,程序會(huì)啟動(dòng)的快一點(diǎn),但是也可能會(huì)導(dǎo)致機(jī)器暫時(shí)間變慢猾愿。
Xmx 是指設(shè)定程序運(yùn)行期間最大可占用的內(nèi)存大小鹦聪。如果程序運(yùn)行需要占用更多的內(nèi)存,超出了這個(gè)設(shè)置值蒂秘,就會(huì)拋出OutOfMemory異常泽本。
Xss 是指設(shè)定每個(gè)線程的堆棧大小。這個(gè)就要依據(jù)你的程序姻僧,看一個(gè)線程大約需要占用多少內(nèi)存规丽,可能會(huì)有多少線程同時(shí)運(yùn)行等。
? GC
新生代:對(duì)象生命周期很短撇贺,用的復(fù)制算法
老年代:對(duì)象存活率高使用“標(biāo)記-清理”或“標(biāo)記-整理”算法赌莺。
3.集合
4.多線程/鎖
5.單點(diǎn)登錄
6.數(shù)據(jù)庫
7.設(shè)計(jì)模式
8.Redis
9.分布式/dubbo/mq