基礎(chǔ)
1、 bio nio區(qū)別
bio 是一種同步阻塞io,讀寫(xiě)必須在一個(gè)線程內(nèi)完成。
nio是同步非阻塞io,基于通道,面向緩沖區(qū)的,同步和異步說(shuō)的是消息的通知機(jī)制,非阻塞體現(xiàn)在,這個(gè)線程可以去干別的,不需要一直在這等著io read writer。
aio異步非阻塞io
2、poll epoll 區(qū)別
poll文件描述符(指針)加載到內(nèi)核態(tài)進(jìn)行監(jiān)控。內(nèi)核態(tài)到用戶(hù)態(tài),來(lái)回拷貝。
epoll(不需要來(lái)回拷貝)
1)調(diào)用epoll_create建立一個(gè)epoll對(duì)象,這個(gè)對(duì)象包含了一個(gè)紅黑樹(shù)和一個(gè)雙向鏈表。并與底層建立回調(diào)機(jī)制。
2)調(diào)用epoll_ctl向epoll對(duì)象中添加這100萬(wàn)個(gè)連接的套接字
3)調(diào)用epoll_wait收集發(fā)生事件的連接。
3、hashCode和equals
如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的
兩個(gè)對(duì)象相等,對(duì)兩個(gè)對(duì)象分別調(diào)用equals方法都返回true
兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的
因此,equals 方法被覆蓋過(guò),則 hashCode 方法也必須被覆蓋
hashCode() 的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫(xiě) hashCode(),則該 class 的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù))
4、Java8中的解決方案
Java8中已經(jīng)提供了官方的解決方案,Java8中新增了一個(gè)注解:@sun.misc.Contended。加上這個(gè)注解的類(lèi)會(huì)自動(dòng)補(bǔ)齊緩存行,需要注意的是此注解默認(rèn)是無(wú)效的,需要在jvm啟動(dòng)時(shí)設(shè)置-XX:-RestrictContended才會(huì)生效。
https://blog.csdn.net/hanmindaxiongdi/article/details/81159314
集合
1、RandomAccess
RandomAccess 接口中什么都沒(méi)有定義。所以,在我看來(lái) RandomAccess 接口不過(guò)是一個(gè)標(biāo)識(shí)罷了。標(biāo)識(shí)什么? 標(biāo)識(shí)實(shí)現(xiàn)這個(gè)接口的類(lèi)具有隨機(jī)訪問(wèn)功能。
下面再總結(jié)一下 list 的遍歷方式選擇:
實(shí)現(xiàn)了 RandomAccess 接口的list,優(yōu)先選擇普通 for 循環(huán) ,其次 foreach,
未實(shí)現(xiàn) RandomAccess接口的list,優(yōu)先選擇iterator遍歷(foreach遍歷底層也是通過(guò)iterator實(shí)現(xiàn)的,),大size的數(shù)據(jù),千萬(wàn)不要使用普通for循環(huán)
2、Hashmap
hashmap1.7put resize 通過(guò)頭插法的方式,并發(fā)可能造成形成一個(gè)循環(huán)鏈表,造成死循環(huán)。
3、ConcurrentHashMap get為什么不需要加鎖
因?yàn)閚ode 節(jié)點(diǎn)的value 和next Node 都是用volatile修飾。并不是因?yàn)閿?shù)組上的volatile。
數(shù)組中的volatile只能保證array中的地址是,并不保證value值是
并發(fā)
1、synchronized 原理
通過(guò)查看字節(jié)碼,同步代碼塊中monitor(對(duì)象頭中),monirotenter,monitorexit指令,同步方法:ACC_SYNCHRONIZED標(biāo)志位同步方法。
對(duì)象頭
偏向鎖、輕量級(jí)鎖加鎖過(guò)程https://www.cnblogs.com/lzh-blogs/p/7477131.html
自旋鎖、鎖消除、鎖粗化
2、AtomicReference,AtomicStampedReference與AtomicMarkableReference的區(qū)別
https://www.cnblogs.com/xyhz0310/p/9627582.html
3、線程中斷的方法
https://www.cnblogs.com/aspirant/p/9184547.html
JVM
1、JDK8堆默認(rèn)比例
默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過(guò)參數(shù) –XX:NewRatio 來(lái)指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。
老年代 ( Old ) = 2/3 的堆空間大小。其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個(gè) Survivor 區(qū)域,這兩個(gè) Survivor 區(qū)域分別被命名為 from 和 to,以示區(qū)分。
默認(rèn)的,Edem : from : to = 8 : 1 : 1 ( 可以通過(guò)參數(shù) –XX:SurvivorRatio 來(lái)設(shè)定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。
2、# JVM: CMS過(guò)程中的promotion failure和concurrent mode failure有何區(qū)別
數(shù)據(jù)庫(kù)
1、mysql分為當(dāng)前讀和快照讀
2、varchar char
varchar 長(zhǎng)度65535 char 255 varchar可變長(zhǎng)度,char定長(zhǎng)
3、磁道、磁盤(pán)塊、頁(yè)
索引是按照磁盤(pán)塊為節(jié)點(diǎn)存儲(chǔ),磁盤(pán)塊中包括,指針、數(shù)據(jù)項(xiàng)
4、MySQ binlog三種模式及設(shè)置方法
行模式 日志中會(huì)記錄每一行數(shù)據(jù)被修改的形式
每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄到master的bin-log中
Mixed 自動(dòng)模式
緩存
redis中的字符串類(lèi)型是怎么實(shí)現(xiàn)的;(SDS)
消息隊(duì)列
1、kafka 高效的原因
1、基于零拷貝技術(shù)
2、磁盤(pán)順序?qū)懭?br>
3、kafka 使用了 分區(qū)、分布式
框架
1、Spring Bean的生命周期
2、spring事務(wù)傳播行為
PROPAGATION_REQUIRED 表示當(dāng)前方法必須運(yùn)行在事務(wù)中。如果當(dāng)前事務(wù)存在,方法將會(huì)在該事務(wù)中運(yùn)行。否則,會(huì)啟動(dòng)一個(gè)新的事務(wù)
PROPAGATION_SUPPORTS 表示當(dāng)前方法不需要事務(wù)上下文,但是如果存在當(dāng)前事務(wù)的話,那么該方法會(huì)在這個(gè)事務(wù)中運(yùn)行
PROPAGATION_MANDATORY 表示該方法必須在事務(wù)中運(yùn)行,如果當(dāng)前事務(wù)不存在,則會(huì)拋出一個(gè)異常
PROPAGATION_REQUIRED_NEW 表示當(dāng)前方法必須運(yùn)行在它自己的事務(wù)中。一個(gè)新的事務(wù)將被啟動(dòng)。如果存在當(dāng)前事務(wù),在該方法執(zhí)行期間,當(dāng)前事務(wù)會(huì)被掛起。如果使用JTATransactionManager的話,則需要訪問(wèn)TransactionManager
PROPAGATION_NOT_SUPPORTED 表示該方法不應(yīng)該運(yùn)行在事務(wù)中。如果存在當(dāng)前事務(wù),在該方法運(yùn)行期間,當(dāng)前事務(wù)將被掛起。如果使用JTATransactionManager的話,則需要訪問(wèn)TransactionManager
PROPAGATION_NEVER 表示當(dāng)前方法不應(yīng)該運(yùn)行在事務(wù)上下文中。如果當(dāng)前正有一個(gè)事務(wù)在運(yùn)行,則會(huì)拋出異常
PROPAGATION_NESTED 表示如果當(dāng)前已經(jīng)存在一個(gè)事務(wù),那么該方法將會(huì)在嵌套事務(wù)中運(yùn)行。嵌套的事務(wù)可以獨(dú)立于當(dāng)前事務(wù)進(jìn)行單獨(dú)地提交或回滾。如果當(dāng)前事務(wù)不存在,那么其行為與PROPAGATION_REQUIRED一樣。注意各廠商對(duì)這種傳播行為的支持是有所差異的。可以參考資源管理器的文檔來(lái)確認(rèn)它們是否支持嵌套事務(wù)
3、容器初始化
注冊(cè)BeanFactoryPostProcessor
注冊(cè)BeanPostProcessor
初始化上下文的消息源(國(guó)際化處理)
初始化了一個(gè)事件傳播器
加載監(jiān)聽(tīng)器
非惰性Bean 初始化
算法
Linux
查看日志中訪問(wèn)次數(shù)最多的前10個(gè)IP
文件格式
1 192.168.1.1
2 192.168.1.2
3 192.168.1.3
4 192.168.1.1
5 192.168.1.1
6 192.168.1.2
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | head -n 10
cut -d ' ' -f 1 access_log |sort |uniq -c | sort -nr | head -n 10
cat access_log|awk -F " " '{print $2}'|sort|uniq -c|sort -nr|head -n 10