JVM內(nèi)存模型
私有的 JAVA虛擬棧 本地方法棧 指令計(jì)數(shù)器
公共的 JAVA虛擬堆 方法區(qū)
虛擬棧:用于保存線程處理方法的信息,線程在處理方法時(shí)會創(chuàng)建一個(gè)棧,用來儲存局部變量表,動態(tài)鏈接,操作棧,方法出口等信息,調(diào)用方法時(shí)調(diào)用入棧,返回?cái)?shù)據(jù)時(shí)調(diào)用出棧。
指令計(jì)數(shù)器 當(dāng)一個(gè)線程被調(diào)用時(shí)計(jì)數(shù)器加1 沒有被調(diào)用時(shí)計(jì)數(shù)器減1 當(dāng)減到0的時(shí)候 執(zhí)行垃圾回收
虛擬堆:用于存放JAVA所有的new對象,供線程使用。根據(jù)對象存活的周期不同JAVA使用分代管理,執(zhí)行垃圾回收
方法區(qū):要加載的類的信息(如類名,修飾符)、類中的靜態(tài)變量、final定義的常量、類中的field、方法信息
JMM內(nèi)存模型
首先它是JAVA內(nèi)存模型,是用來決定JAVA線程的訪問規(guī)則,每個(gè)線程執(zhí)行方法時(shí) 擁有自己的工作內(nèi)存,工作內(nèi)存保存的是主內(nèi)存的副本
例如線程A 對每個(gè)變量的讀寫操作只能是在自己的工作副本完成,修改完以后再更新到主內(nèi)存里 由線程B去訪問
因?yàn)橛锌赡茉斐芍噶钪嘏判?,線程B先訪問 線程A后寫入 這樣線程B就無法讀取到正確的數(shù)據(jù),所以JMM需要提供原子性 有序性 可見性,
首先 JMM保證基礎(chǔ)類型 除(long double)外屬于原子性,或者使用synchronized,也可用volatile強(qiáng)制變量賦值同步刷新到主內(nèi)存,并且它的另一個(gè)作用是阻止指令重排序
類加載
1、把.class文件加載到內(nèi)存
2、驗(yàn)證文件格式,字節(jié)碼,元數(shù)據(jù)是否符合編譯器要求
3、準(zhǔn)備分配內(nèi)存,例如static 但這里只準(zhǔn)備不初始化,默認(rèn)是0或者null,代碼中具體值在初始化階段。但是final在編譯時(shí)已經(jīng)分配好所以不需要
4、字段解析,接口解析,方法解析等
5、初始化靜態(tài)方法,靜態(tài)變量
JAVA加載器分為
BootStarp ClassLoader 系統(tǒng)類加載器
Ext ClassLoader 系統(tǒng)類加載器
App ClassLoader 系統(tǒng)類加載器
Custom ClassLoader 自定義加載器
同時(shí)加載器以雙親委派模式,就是加載器加載一個(gè)請求先由父類加載器執(zhí)
行,如果父類加載器不行再向上委托直到頂層加載器,同樣如果頂層加載
器不能加載再傳遞給子類加載器,這樣的好處是避免重復(fù)加載和JAVA核心API被篡改
JAVA GC
什么是GC:就是垃圾回收
如何GC:JAVA在內(nèi)存不足時(shí)會嘗試觸發(fā)GC 或者手動調(diào)用 System.gc()
分代管理
JAVA的堆是由分代管理,作用是方便垃圾回收。
分代管理分為:年輕代 老年代 持久代。
年輕代指剛開始存在的數(shù)據(jù)
年輕代分為3塊 Eden | Survivor1 | Survivor2 如果Eden存放滿了就會交給Survivor 區(qū)交替存放
老年代指存放從年輕代存放較長的數(shù)據(jù)
永久代指存放類的信息,并且是對象劃分方式
垃圾回收方式
1、標(biāo)記清除法:標(biāo)記每個(gè)可以訪問的對象,然后清除掉未標(biāo)記的對象
2、引用計(jì)數(shù)法:對象被引用一次+1 沒有被引用-1 直到為0則清除,缺點(diǎn)是沒法解決循環(huán)引用的問題
3、復(fù)制法:需要兩塊大小相同的內(nèi)存區(qū)域,對象分配只在A內(nèi)存塊,回收的時(shí)候復(fù)制A到B內(nèi)存塊然后清除A內(nèi)存塊。下次又把B內(nèi)存塊復(fù)制到A內(nèi)存塊,清除B內(nèi)存塊,就這樣交替使用,缺點(diǎn)是內(nèi)存使用率較低
4、標(biāo)記整理法:所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存
5、分代收集算法:年輕代因?yàn)榇婊顚ο笊倬陀脧?fù)制法清理,老年代存活對象多就用標(biāo)記整理法
JAVA 線程
實(shí)現(xiàn)線程的方法可分兩個(gè)繼承Thread類或者實(shí)現(xiàn)Runnable接口,當(dāng)然不管使用哪個(gè)都需要實(shí)現(xiàn)run方法
當(dāng)調(diào)用Thread.Start()方法時(shí)會新建一個(gè)線程對象
線程的生命周期為:
NEW 創(chuàng)建
RUNNABLE 等待 因?yàn)榫€程并不會馬上開始執(zhí)行 在這個(gè)狀態(tài)時(shí)會暫時(shí) READY 等待CPU調(diào)度 然后才進(jìn)入RUNING注意當(dāng)進(jìn)入RUNING狀態(tài)后會轉(zhuǎn)換成 BLOCKED TIME_WAITING WAITING TERMINATED
BLOCKED 當(dāng)線程進(jìn)入到同步塊或者同步方法時(shí)如synchronized 如果獲取鎖失敗就會進(jìn)入該狀態(tài)
TIME_WAITING 有超時(shí)時(shí)間的等待狀態(tài) 例如執(zhí)行了 Thead.sleep(long) Thead.join(long) Object.wait(long)
WAITING 無超時(shí)時(shí)間等待狀態(tài) 例如執(zhí)行了 wait() 在使用了Object.notify()或者Object.notifyAll() 會恢復(fù)正常
解決線程的同步互斥方法有 CAS synchronized Lock
什么是AOP
個(gè)人理解AOP就是把一個(gè)項(xiàng)目里相同的功能點(diǎn) 例如 用戶權(quán)限驗(yàn)證 剝離出來 通過代理模式來執(zhí)行
例如 銀行取錢 存錢 兩個(gè)功能 都需要執(zhí)行驗(yàn)證用戶的密碼這步驟 但這個(gè)步驟跟本身金錢變更并無直接關(guān)系且屬于完全重復(fù)功能,這個(gè)時(shí)候就可以把密碼驗(yàn)證這個(gè)功能給剝離出來
AOP有哪些知識點(diǎn)
引用 https://blog.csdn.net/qq_32317661/article/details/82878679
1.通知(Advice)就是你想要的功能,安全,事物,日志等。你給先定義好把,然后在想用的地方用一下。
2.連接點(diǎn)(JoinPoint)這個(gè)更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個(gè)方法的前,后(兩者都有也行),或拋出異常時(shí)都可以是連接點(diǎn),spring只支持方法連接點(diǎn).其他如aspectJ還可以讓你在構(gòu)造器或?qū)傩宰⑷霑r(shí)都行,不過那不是咱關(guān)注的,只要記住,和方法有關(guān)的前前后后(拋出異常),都是連接點(diǎn)。
3.切入點(diǎn)(Pointcut)上面說的連接點(diǎn)的基礎(chǔ)上,來定義切入點(diǎn),你的一個(gè)類里,有15個(gè)方法,那就有幾十個(gè)連接點(diǎn)了對把,但是你并不想在所有方法附近都使用通知(使用叫織入,以后再說),你只想讓其中的幾個(gè),在調(diào)用這幾個(gè)方法之前,之后或者拋出異常時(shí)干點(diǎn)什么,那么就用切點(diǎn)來定義這幾個(gè)方法,讓切點(diǎn)來篩選連接點(diǎn),選中那幾個(gè)你想要的方法。
4.切面(Aspect)切面是通知和切入點(diǎn)的結(jié)合?,F(xiàn)在發(fā)現(xiàn)了吧,沒連接點(diǎn)什么事情,連接點(diǎn)就是為了讓你好理解切點(diǎn),搞出來的,明白這個(gè)概念就行了。通知說明了干什么和什么時(shí)候干(什么時(shí)候通過方法名中的before,after,around等就能知道),而切入點(diǎn)說明了在哪干(指定到底是哪個(gè)方法),這就是一個(gè)完整的切面定義。
5.引入(introduction)允許我們向現(xiàn)有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標(biāo)類中嗎
6.目標(biāo)(target)引入中所提到的目標(biāo)類,也就是要被通知的對象,也就是真正的業(yè)務(wù)邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注于業(yè)務(wù)本身的邏輯。
7.代理(proxy) 怎么實(shí)現(xiàn)整套aop機(jī)制的,都是通過代理,這個(gè)一會給細(xì)說。
8.織入(weaving) 把切面應(yīng)用到目標(biāo)對象來創(chuàng)建新的代理對象的過程。有3種方式,spring采用的是運(yùn)行時(shí)
List和Set區(qū)別
List 是有序排列 允許重復(fù)值,Set 是無序排列 不允許重復(fù)值,共同點(diǎn)是都繼承Collection
Bean生命周期
Spring Boot Cloud
Eureka 服務(wù)注冊中心 所有的服務(wù)都要注冊在該上面才能相互找到 并且自帶輪詢功能
Zuul 作用路由器 對權(quán)限 攔截器 用戶認(rèn)證 繼承ZuulFilter實(shí)現(xiàn)攔截器
Feign 負(fù)載均衡 通過注解@Client實(shí)現(xiàn)各個(gè)服務(wù)之間的交換
一、關(guān)于Java虛擬機(jī)底層原理與性能優(yōu)化
1、Java虛擬機(jī)內(nèi)存模型能說說嗎?
2、類加載器的雙親委派模型是什么?
3、JVM垃圾收集算法與收集器有哪些?
4、JVM診斷調(diào)優(yōu)工具用過哪些?
5、每秒幾十萬并發(fā)的秒殺系統(tǒng)為什么會頻繁發(fā)生GC?
6、日均百萬級交易系統(tǒng)如何優(yōu)化JVM?
二、關(guān)于Mysql索引數(shù)據(jù)結(jié)構(gòu)與性能優(yōu)化
1、索引數(shù)據(jù)結(jié)構(gòu)紅黑樹,Hash,B+樹能說下嗎?
2、千萬級數(shù)據(jù)表如何用索引快速查找?
3、如何基于索引B+樹精準(zhǔn)建立高性能索引?
4、聯(lián)合索引底層數(shù)據(jù)結(jié)構(gòu)又是怎樣的?
5、覆蓋索引與聚集索引到底是什么?
6、Mysql最左前綴優(yōu)化原則是什么?
三、關(guān)于BIO,NIO,AIO,Netty及Redis線程模型
1、BIO,NIO,AIO的區(qū)別?
2、什么是阻塞IO以及非阻塞IO?
3、Reactor和Proactor IO設(shè)計(jì)模式是什么?
4、NIO底層select、poll和epoll實(shí)現(xiàn)的區(qū)別 ?
5、Java NIO的幾個(gè)核心組成部分是什么?作用分別是什么?
6、Redis、Netty、Tomcat的線程模型與NIO的聯(lián)系是什么?