三磕道、面試總結(jié)(三)

1,java堆行冰,分新生代老年代溺蕉,新生代有Eden伶丐,from surviver,to surviver三個空間疯特,堆被所有線程共哗魂。eden內(nèi)存不足時,發(fā)生一次minor GC漓雅,會把from survivor和eden的對象復(fù)制到to survivor录别,這次的to survivor就變成了下次的from survivor,經(jīng)過多次minor GC邻吞,默認(rèn)15次组题,達(dá)到次數(shù)的對象會從survivor進(jìn)行老年代。1次new如果新生代裝不下吃衅,則直接進(jìn)入老年代往踢。

2腾誉,HashMap和HashTable是使用數(shù)組+鏈表結(jié)構(gòu)實現(xiàn)徘层,根據(jù)Hash和table長度計算數(shù)組的下標(biāo)index做操作,hashMap默認(rèn)數(shù)組長度為16利职,hashMap對null值的key都放在table[0]的位置趣效,table[index]形成1個鏈表,當(dāng)然在新版jdk中鏈表節(jié)點數(shù)>8會變成紅黑樹結(jié)構(gòu)猪贪。hashMap達(dá)到最大數(shù)量會擴(kuò)容跷敬,擴(kuò)容table長度變?yōu)?倍,每個元素(table中)但重新計算index放到新的table中热押。

3西傀,堆的年輕代和老年代。

堆的年輕代大則老年代小桶癣,GC少拥褂,但是每次時間會比較長。年輕代小則老年代大牙寞,會縮短每次GC的時間饺鹃,但是次數(shù)頻繁〖淙福可以讓老年代盡量緩存常用對象悔详,JVM默認(rèn)年輕代和老年代的大小比例為1:2,。觀察峰值老年代內(nèi)存惹挟,不影響full GC茄螃,加大老年代可調(diào)1:1,但是要給老年代預(yù)留三分之一的空間连锯。減少使用全局變量和大對象 归苍,調(diào)整新生代党巾,老年代到最合適。

4霜医,字節(jié)流不會用到內(nèi)存緩沖區(qū)齿拂,文件本身直接操作。字符流操作使用內(nèi)存緩存區(qū)肴敛,用緩存存操作文件署海。字符流在輸出前將所有內(nèi)容暫時保存到內(nèi)存中,即緩存區(qū)暫時存儲医男,如果想不關(guān)閉也將字符流輸出則可以使用flush方法強(qiáng)制刷出砸狞。字節(jié)字符轉(zhuǎn)化可能存在系統(tǒng)編碼lang,要制定編碼镀梭。getbyte字節(jié)流使用更加廣泛刀森。

5,中文占用2個字節(jié)报账,read()函數(shù)讀1個字節(jié)把A會讀入的原因研底。ASCII碼是8位,A在ASCII碼中有對應(yīng)碼透罢,A只要8位就能表示榜晦,但是unicode是支持ASCII碼的,在unicode中表示A是使用低8位的ASCII碼羽圃,補(bǔ)上高8位的0乾胶,read()1分字節(jié)就已經(jīng)讀入A的ASCII碼,打印時會給其高8位補(bǔ)上0朽寞,所以顯示正常A识窿。

6,喚醒一個阻塞的線程

如因為Sleep脑融,wait喻频,join等阻塞,可以使用interrupted exception異常喚醒吨掌。

7半抱,內(nèi)存溢出可能原因和解決。

原因可能是A膜宋,數(shù)據(jù)加載過多窿侈,如1次從數(shù)據(jù)庫中取出過多數(shù)據(jù) B,集合類中有對對象的引用秋茫,用完后沒有清空或者集合對象未置空導(dǎo)致引用存在等史简,是的JVM無法回收 C,死循環(huán),過多重復(fù)對象 D圆兵,第三方軟件的bug E跺讯,啟動參數(shù)內(nèi)存值設(shè)定的過小。

例如方法:修改JVM啟動參數(shù)殉农,加內(nèi)存(-Xms刀脏,-Xmx);錯誤日志超凳,是否還有其他錯誤愈污;代碼走查

8,redis使用單線程模型轮傍,數(shù)據(jù)順序提交暂雹,redis支持主從模式,mencache只支持一致性hash做分布式创夜;redis支持?jǐn)?shù)據(jù)落地杭跪,rdb定時快照和aof實時記錄操作命令的日志備份,memcache不支持驰吓;redis數(shù)據(jù)類型豐富涧尿,有string,hash棚瘟,set现斋,list喜最, sort set偎蘸,而memcache只支持簡單數(shù)據(jù)類型;memcache使用cas樂觀鎖做一致性瞬内。

jedis操作Hash:hmset, hmget, hdel, hkeys

jedis操作List: lpush迷雪,lrange按照范圍取出,rpush虫蝶, del章咧, sort等keyjedis操作Set:sadd,srem移除noname能真,smembers赁严, sismember, scard等粉铐。

使用場景例如

Hash:存儲讀取更新用戶多個屬性

List:微博TimeLine疼约,消息列表

Set:共同好友,二度好友蝙泼,用唯一性可以統(tǒng)計網(wǎng)站所有獨立IP程剥,好友推薦根據(jù)tag求交集,大于threshold就可以推薦汤踏。

sortset:set增加1個權(quán)重score參數(shù)

其他場景:A訂閱發(fā)布系統(tǒng)织鲸,redis對某個key消息發(fā)布及訂閱舔腾,當(dāng)1個key消息發(fā)布后,所有訂閱它的客戶端都會收到相應(yīng)消息搂擦,例如實時消息系統(tǒng)稳诚,即時聊天,群聊等瀑踢。

事務(wù)-常用EX,EC提交執(zhí)行的命令采桃,在server不出問題,可以保證一連串的命令是順序執(zhí)行額丘损;提供1個watch功能普办,對1個key作watch,然后再執(zhí)行transation徘钥。

9衔蹲,Class.forName()將類加載到JVM,還會對類解釋呈础,執(zhí)行static塊舆驶,而ClassLoader也加載到JVM,但是不會執(zhí)行static塊而钞,并且只有調(diào)用了new Instance方法才會調(diào)用構(gòu)造函數(shù)沙廉。

10,java反射機(jī)制臼节。

可以在運行時判斷一個對象所屬的類撬陵,構(gòu)造一個類的對象,判斷類具有的成員變量和方法网缝,調(diào)用1個對象的方法巨税。4個關(guān)鍵的類:Class,Constructor粉臊,F(xiàn)ield草添,Method。 getConstructor獲得構(gòu)造函數(shù)/getDeclardConstructor扼仲; getField/getFields/getDeclardFields獲得類所生命的所有字段远寸;getMethod/getMethods/getDeclardMethod獲得類聲明的所有方法,正常方法是一個類創(chuàng)建對象屠凶,而反射是1個對象找到1個類驰后。

11,Object類中的方法:clone()阅畴,但是使用該方法必須實現(xiàn)Java.lang.Cloneable接口倡怎,equal()方法判斷引用是否一致,指向同一對象,即相等于==监署,只有覆寫了equals()方法之后颤专,才可以說不同。hashcode()钠乏,對象的地址栖秕, toString(), finalize()晓避。

12簇捍,序列化和反序列化

序列化和反序列化即對象和字節(jié)序列間的轉(zhuǎn)化,進(jìn)程間傳送文本圖片音頻等以二進(jìn)制傳送俏拱。JDK中ObjectOuputStream和ObjectInputStream為輸出輸入流暑塑,只有實現(xiàn)SeriaLizable/Externalizable接口的類才能被序列化。如Person對象傳遞給內(nèi)存流使用DataConstractJsonSeralizer锅必, MemoryStream stream = new MemoryStream(); DataConstractJsonSeralizer SER = new DataConstractJsonSeralizer(typeof(person)); ser.writeObjectStream(stream, person);顯示json輸出事格,StramReader sr = new StreamReader(stream1); sr.ReadToEnd()。

13搞隐,講講分布式唯一ID驹愚。

確定ID存儲用64位,1個64位二進(jìn)制1是這樣的00000000.....1100......0101劣纲,切割64位逢捺,某段二進(jìn)制表示成1個約束條件,前41位為毫秒時間癞季,后緊接9位為IP劫瞳,IP之后為自增的二進(jìn)制,記錄當(dāng)前面位數(shù)相同情況下是第幾個id余佛,如現(xiàn)在有10臺機(jī)器柠新,這個id生成器生成id極限是同臺機(jī)器1ms內(nèi)生成2的14次方個ID。

分布式唯一ID = 時間戳 << 41位辉巡, int類型服務(wù)器編號 << 10,序列自增sequence蕊退。每個時間戳內(nèi)只能生成固定數(shù)量如(10萬)個自增號郊楣,達(dá)到最大值則同步等待下個時間戳,自增從0開始瓤荔。將毫秒數(shù)放在最高位净蚤,保證生成的ID是趨勢遞增的,每個業(yè)務(wù)線输硝、每個機(jī)房今瀑、每個機(jī)器生成的ID都是不同的。如39bit毫秒數(shù)|4bit業(yè)務(wù)線|2bit機(jī)房|預(yù)留|7bit序列號。高位取2016年1月1日1到現(xiàn)在的毫秒數(shù)橘荠,系統(tǒng)運行10年屿附,至少需要10年x365天x24小時x3600秒x1000毫秒=320x10~9,差不多39bit給毫秒數(shù)哥童,每秒單機(jī)高峰并發(fā)小于100挺份,差不多7bit給每毫秒的自增號痕钢,5年內(nèi)機(jī)房小于100臺機(jī)器继阻,預(yù)留2bit給機(jī)房,每個機(jī)房小于100臺機(jī)器猎贴,預(yù)留7bit給每個機(jī)房朵你,業(yè)務(wù)線小于10個各聘,預(yù)留4bit給業(yè)務(wù)線標(biāo)識。

64bit分布式ID(42bit毫秒+5bit機(jī)器ID+12位自增)等

生成分布式ID的方式:A抡医,2個自增表伦吠,步長相互隔開 B,時間的毫秒或者納秒 C魂拦,UUID D毛仪,64位約束條件(如上)

14,NIO和IO的區(qū)別

第一點芯勘,NIO少了1次從內(nèi)核空間到用戶空間的拷貝箱靴。

ByteBuffer.allocateDirect()分配的內(nèi)存使用的是本機(jī)內(nèi)存而不是Java堆上的內(nèi)存,和網(wǎng)絡(luò)或者磁盤交互都在操作系統(tǒng)的內(nèi)核空間中發(fā)生荷愕。allocateDirect()的區(qū)別在于這塊內(nèi)存不由java堆管理, 但仍然在同一用戶進(jìn)程內(nèi)衡怀。

第二點,NIO以塊處理數(shù)據(jù)安疗,IO以流處理數(shù)據(jù)

第三點抛杨,非阻塞,NIO1個線程可以管理多個輸入輸出通道

15荐类,內(nèi)存泄漏

未對作廢數(shù)據(jù)內(nèi)存單元置為null怖现,盡早釋放無用對象的引用,使用臨時變量時玉罐,讓引用變量在推出活動域后自動設(shè)置為null屈嗤,暗示垃圾收集器收集;程序避免用String拼接吊输,用StringBuffer饶号,因為每個String會占用內(nèi)存一塊區(qū)域;盡量少用靜態(tài)變量(全局不會回收)季蚂;不要集中創(chuàng)建對象尤其大對象茫船,可以使用流操作琅束;盡量使用對象池,不再循環(huán)中創(chuàng)建對象算谈,優(yōu)化配置涩禀;創(chuàng)建對象到單例getInstance中,對象無法回收被單例引用濒生;服務(wù)器session時間設(shè)置過長也會引起內(nèi)存泄漏埋泵。

16,對象克隆和實現(xiàn)方式

克隆的對象可能包含一些已經(jīng)修改過的屬性罪治,而new1個對象屬性都還是初始化時候的值丽声,被復(fù)制克隆的類要實現(xiàn)Clonable接口,覆蓋clone()方法觉义,訪問修飾符為public雁社,方法中調(diào)用super.clone()得到所需要的復(fù)制方法,類中的屬性類也需要實現(xiàn)Clonable接口晒骇,覆寫clone()方法霉撵,并在super中也調(diào)用子屬性類的clone()復(fù)制,才可以實現(xiàn)深拷貝洪囤。

或者寫到流中序列化的方式來實現(xiàn)徒坡,不必考慮引用類型中還包含引用類型,直接用序列化來實現(xiàn)對象的深復(fù)制拷貝瘤缩,即將對象寫到流喇完,再從流中讀出來,需要實現(xiàn)seriazation接口剥啤。

17锦溪,redis內(nèi)存數(shù)據(jù)上升到一定大小會執(zhí)行數(shù)據(jù)淘汰策略,redis提供了6種數(shù)據(jù)淘汰策略府怯。

LRU:從已設(shè)置過期時間的數(shù)據(jù)集合中挑選最近最少使用的數(shù)據(jù)淘汰

random:從已設(shè)置過期時間的數(shù)據(jù)中挑選任意數(shù)據(jù)淘汰

ttl:從已設(shè)置過期時間的數(shù)據(jù)集合中挑選將要過期的數(shù)據(jù)淘汰刻诊。

notenvision:禁止驅(qū)逐數(shù)據(jù)

如mysql中有2千萬數(shù)據(jù),redis只存儲20萬的熱門數(shù)據(jù)牺丙。LRU或者TTL都滿足熱點數(shù)據(jù)讀取較多则涯,不太可能超時特點。

redis特點:速度塊赘被,O(1)是整,豐富的數(shù)據(jù)類型,支持事物原子性民假,可用于緩存,比memecache速度塊龙优,可以持久化數(shù)據(jù)羊异。

常見問題和解決:Master最好不做持久化如RDB快照和AOF日志文件事秀;如果數(shù)據(jù)比較重要,某分slave開啟AOF備份數(shù)據(jù)野舶,策略為每秒1次易迹,為了主從復(fù)制速度及穩(wěn)定,MS主從在同一局域網(wǎng)內(nèi)平道;主從復(fù)制不要用圖狀結(jié)構(gòu)睹欲,用單向鏈表更為穩(wěn)定 M-S-S-S-S。一屋。窘疮。。冀墨;redis過期采用懶漢+定期闸衫,懶漢即get/set時候檢查key是否過期,過期則刪除key诽嘉,定期遍歷每個DB蔚出,檢查制定個數(shù)個key;結(jié)合服務(wù)器性能調(diào)節(jié)并發(fā)情況虫腋。

過期淘汰骄酗,數(shù)據(jù)寫入redis會附帶1個有效時間,這個有效時間內(nèi)該數(shù)據(jù)被認(rèn)為是正確的并不關(guān)心真實情況悦冀,例如對支付等業(yè)務(wù)采用版本號實現(xiàn)趋翻,redis中每一份數(shù)據(jù)都維持1個版本號,DB中也維持1份雏门,只有當(dāng)redis的與DB中的版本一致時嘿歌,才會認(rèn)為redis為有效的,不過仍然每次都要訪問DB茁影,只需要查詢version版本字段即可宙帝。

18,異步化募闲,生產(chǎn)接口每秒鐘10萬并發(fā)步脓,消費者用異步慢慢消費。緩存模式空間換時間浩螺,把1兩億的數(shù)據(jù)名單打到緩存靴患。服務(wù)降級,把不重要的任務(wù)放棄要出;靜態(tài)資源離線包下載機(jī)制鸳君,在wify下會主動提前把靜態(tài)下載前端層保護(hù)可請將用戶請求延長,點擊后主動給它隨機(jī)等待2s的時間/2分鐘之內(nèi)不能請求患蹂;后端做部分接口的開關(guān)或颊,設(shè)置超短耗時時間砸紊,原來只用5ms的只給20ms。

系統(tǒng)一段時間內(nèi)會自動重試囱挑,重試多次后就認(rèn)為是失敗了醉顽,檢查支付接口返回該訂單的錢,支付操作如果回復(fù)錯誤則回滾扣庫存的事務(wù)平挑,沒返回則會記錄進(jìn)行中pendding狀態(tài)游添,結(jié)束整個過程,等通知失敗/成功通熄,AB系統(tǒng)之間會出現(xiàn)死循環(huán)補(bǔ)償唆涝,如B退單不成功,一般就是記錄錯誤日志了棠隐。超時每隔一段時間去定時回調(diào)服務(wù)定時回滾石抡,一定次數(shù)還是超時則提示用戶聯(lián)系客服,訂單庫存可以不會滾助泽,記錄狀態(tài)啰扛,如果一直調(diào)用支付不成功,則讓用戶自己去處理聯(lián)系客服嗡贺,可以不回滾用戶的數(shù)據(jù)隐解,金額扣了才算真正完成,是一種簡單粗暴的做法诫睬。

公共配置抽象成存儲到zookeeper配置中心或者redis等煞茫,DB也存儲一份,各應(yīng)用監(jiān)聽ZK的配置變化摄凡,可以建一個配置web管理頁面续徽。

19,dubbo用ProxyFactoty代理工廠將HelloServiceImpl封裝成1個Inoke執(zhí)行亲澡,即ProxyFactory.getInvoke(ref, (Class)接口钦扭,注冊URL,解碼參數(shù))床绪,并將Invoke導(dǎo)出成1個Exporter客情,包括去注冊中心ZK注冊服務(wù)。Invoke有本地執(zhí)行的Invoke癞己,遠(yuǎn)程通信執(zhí)行的Invoke膀斋。

20,每次扣減庫存時加上1個請求流水編號痹雅,上層請求扣減庫存沒拿到結(jié)果的話仰担,重新查詢1次做重試操作,量不大都是加鎖處理绩社。減少鎖的時間惰匙,犧牲冪等性技掏,扣減為DB下地操作铃将,查詢扣減和設(shè)置合成1步项鬼,中間沒有網(wǎng)絡(luò)請求。利用緩存劲阎,通過寫log記錄操作绘盟,異步合并日志及更新,重啟時cache失效悯仙,讀log恢復(fù)龄毡,避免重復(fù)提交,寫操作不建議重試快速失敗锡垄。多個商品同時增減庫存沦零,可使用訂單號做冪等處理,應(yīng)用層對單個商品減庫存货岭,操作排隊路操,商品消息ID路由在1個應(yīng)用server處理,讀本地緩存千贯,失效再redis屯仗,DB采用樂觀鎖,組提交搔谴,1次減庫存多個訂單的購買量魁袜。可將同一個key下庫存m分為n組k1......kn敦第,每組數(shù)為m/n峰弹,扣減依次在各組扣減,減少并發(fā)沖突芜果。隊列裝滿后關(guān)閉隊列進(jìn)入鞠呈,然后用戶輪訓(xùn)自己是否搶到了異步ajax,用戶資源隊列固定長度师幕。2個隊列粟按,1個銷售的資源隊列放入redis,有另外1個隊列用來裝搶購的會員的uid霹粥。

紅包狀態(tài)正常灭将,并成功將狀態(tài)改為“已領(lǐng)取”,且消息發(fā)送成功后控,用戶端開始消費該消息庙曙,如果消費失敗/超時,用MQ做重試做冪等浩淘,直到成功捌朴,每條消息有唯一編號且保證消息處理成功與去重表的日志同時出現(xiàn)吴攒。

熱點將hot data拆分,分在不同庫和不同表砂蔽,分散熱點Data洼怔,減輕DB并發(fā)更新熱點帶來RT升高和應(yīng)用連接超時。SQL在mysql層加以限制左驾,SQL超時/thradrunning到1定值則拒絕SQL執(zhí)行镣隶,一定時間異步將結(jié)果寫入DB,nginx對IP做限制诡右,可能誤殺安岂。

21,SpringAOP帆吻,XML配置<aop:config>域那,切面<aop:aspect>切點<aop:pointcut>,連接切點和通知方法<aop:before>和<aop:after>等猜煮,注解可以直接使用@before執(zhí)行方法@after 次员,@before(“pointcut()”) ,@after("pointcut")友瘤, @Aroud("excutete())翠肘,@AfteReturning,@AfterThrowing辫秧,可作日志事務(wù)束倍,權(quán)限等待,AOP即通過把具體的類創(chuàng)建對應(yīng)的 代理類盟戏,從代理類來對具體進(jìn)行操作绪妹。

目標(biāo)實現(xiàn)了接口,默認(rèn)采用JDK實現(xiàn)AOP柿究,也可以強(qiáng)制使用CGlib來實現(xiàn)AOP邮旷,目標(biāo)沒有實現(xiàn)接口的話,則必須采用CGlib蝇摸,Spring自動在JDK和CGlib切換婶肩。如果要求spring強(qiáng)制使用CGlib實現(xiàn)AOP,則可以配置貌夕,添加Cglib庫律歼。。啡专。jar险毁, Spring配置文件中加入<aop:aspecj-autoproxy proxy-target-Class=true>

22,MyISM采用表級鎖,對Myism表讀不會阻塞讀畔况,會阻塞同表寫鲸鹦,對Myism寫則會阻塞讀和寫,即一個線程獲得1個表的寫鎖后跷跪,只有持有鎖的線程可以對表更新操作馋嗜,其他線程的讀和寫都會等待。

InnoDB域庇,采用行級鎖嵌戈,支持事務(wù),例如只對a列加索引听皿,如果update ...where a=1 and b=2其實也會鎖整個表, select 使用共享鎖宽档,update insert delete采用排它鎖尉姨,commit會把鎖取消,當(dāng)然select by id for update也可以制定排它鎖吗冤。

23又厉,實時隊列采用雙隊列模式,生產(chǎn)者將行為記錄寫入Queue1椎瘟,worker服務(wù)從Queue1消費新鮮數(shù)據(jù)覆致,如果異常則寫入Queue2(主要保存異常數(shù)據(jù)),RetryWorker會監(jiān)聽Queue2肺蔚,消費異常數(shù)據(jù)煌妈,如果還未處理成功按照一定的策略等待或者將異常數(shù)據(jù)再寫入Queue2,如果數(shù)據(jù)發(fā)生積壓可以調(diào)整worker的消費游標(biāo)宣羊,從最新數(shù)據(jù)重新開始消費璧诵,保證了最新data得到處理,中間未處理的一段則可以啟動backupWorker指定起止游標(biāo)在消費完指定區(qū)間的數(shù)據(jù)后仇冯,backupWorker會自動停止之宿。

DB降級開關(guān)后,可直接寫入redis(storm)苛坚,同時將數(shù)據(jù)寫入一份到Retry隊列比被,在開啟DB降級開關(guān)后消費Retry隊列中的數(shù)據(jù),從而把數(shù)據(jù)寫入到mysql中泼舱,達(dá)到最終一致性等缀。MYSQL切分為分片為2的N次方,例如原來分為兩個庫d0和d1均放在s0服務(wù)器上柠掂,s0同時有備機(jī)s1项滑,擴(kuò)容只要幾步驟:確保s0到s1服務(wù)器同步順利,沒有明顯延遲;s0暫時關(guān)閉讀寫權(quán)限枪狂;確保s1已經(jīng)完全同步到s0更新危喉;s1開放讀寫權(quán)限;d1的dns由s0切換到s1州疾;s0開放讀寫權(quán)限辜限。

24,DB的特性和隔離級別

4大特性:原子性严蓖,一致性薄嫡,分離性,持久性

隔離級別:

讀提交:寫事務(wù)禁止讀

讀未提交:寫事務(wù)允許讀

可重復(fù)讀:寫事務(wù)禁止讀事務(wù)颗胡,讀禁止寫

序列化:全部禁止

詳細(xì)說明:讀提交1個事務(wù)開始寫則全部禁止其他事務(wù)訪問該行毫深。讀未提交1個事務(wù)開始寫則不允許其他事務(wù)同時寫,但可以讀毒姨⊙颇瑁可重復(fù)讀 讀事務(wù)會禁止寫事務(wù),寫事物則禁止其他任何事務(wù)弧呐。序列化性能最低闸迷,全部禁止,串行執(zhí)行俘枫。 MYSQL默認(rèn)的是可重復(fù)讀腥沽。

25,帖子服務(wù)鸠蚪、元數(shù)據(jù)服務(wù)今阳、帖子搜索服務(wù),提供索引數(shù)據(jù)存儲邓嘹,tid和uid查詢直接從帖子服務(wù)從元數(shù)據(jù)返回酣栈,其他檢索查詢有帖子搜索服務(wù)從索引數(shù)據(jù)檢索并返回,帖子服務(wù)增刪改查用MQ同步到帖子搜索服務(wù)汹押,搜索服務(wù)修改索引的數(shù)據(jù)(索引樹矿筝,倒排表),索引表t_mapping(tid棚贾,uid)窖维。

300億數(shù)據(jù)在全量索引庫中,數(shù)百萬一天內(nèi)修改過的數(shù)據(jù)在一天庫中妙痹,50萬小時內(nèi)修改過的數(shù)據(jù)在小時庫中铸史,在update請求時,只會操作最低級別的索引例如小時庫怯伊。小時庫琳轿,1小時合并一次,合并到天庫,天庫一天合并1次崭篡,合并到全量庫中挪哄。

26,講一下NIO和網(wǎng)絡(luò)傳輸

NIO Reactor反應(yīng)器模式琉闪,例如汽車是乘客訪問的實體reactor迹炼,乘客上車后到售票員處Acceptor登記,之后乘客便可休息睡覺了颠毙,到達(dá)乘客目的地后斯入,售票員Aceptor將其喚醒即可。持久TCP長鏈接每個client和server之間有存在一個持久連接蛀蜜,當(dāng)CCU(用戶并發(fā)數(shù)量)上升刻两,阻塞server無法為每個連接運行1個線程,自己開發(fā)1個二進(jìn)制協(xié)議涵防,將message壓縮至3-6倍闹伪,傳輸雙向且消息頻率高,假設(shè)server鏈接了2000個client壮池,每個client平均每分鐘傳輸1-10個message,1個messaged的大小為幾百字節(jié)/幾千字節(jié)杀怠,而server也要向client廣播其他玩家的當(dāng)前信息椰憋,需要高速處理消息的能力。Buffer赔退,網(wǎng)絡(luò)字節(jié)存放傳輸?shù)牡胤匠纫溃瑥腸hannel中讀寫,從buffer作為中間存儲格式硕旗,channel是網(wǎng)絡(luò)連接與buffer間數(shù)據(jù)通道窗骑,像之前的socket的stream。

27漆枚,緩存擊透

預(yù)加載创译;

加載DB時同步,其他則等待墙基;

DB端做SQL合并软族,Queue合并排隊處理;

部分緩存設(shè)置為永不過期残制;

先清除緩存立砸,讀取數(shù)據(jù)時候則等待500ms,500ms緩存應(yīng)該已經(jīng)加載完成初茶;

采用雙key緩存颗祝,A1為原始緩存,A2為拷貝緩存;

如果DB為空null則g給redis設(shè)置1個NFC空nei容螺戳。

28搁宾,Dubbo源碼使用了哪些設(shè)計模式

A,工廠模式温峭,ExtenstionLoader.getExtenstionLoader(Protocol.class).getAdaptiveExtenstion()

B猛铅,裝飾器模式+責(zé)任鏈,以provider的調(diào)用鏈為例凤藏,具體調(diào)用鏈代碼是在protocolFilterWrapper的buildInvokeChain完成的,將注解中含有g(shù)roup=provider的Filter實現(xiàn)奸忽,調(diào)用順序為EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ExceptionFilter -> TimeoutFilter -> MonitorFilter -> TraceFilter。裝飾器模式和責(zé)任鏈混合使用揖庄,Echo是回聲測試請求栗菜,ClassLoaderFilter則只是在其主功能上添加了功能。

C蹄梢,觀察者模式疙筹,provider啟動時需要與注冊中心交互,先注冊自己的服務(wù)禁炒,再訂閱自己的服務(wù)而咆,訂閱時采用了觀察者模式,注冊中心每5s定時檢查是否有服務(wù)更新幕袱,有更新則向服務(wù)提供者發(fā)送1個notify消息后即可運行NotifyListener的notity方法暴备,執(zhí)行監(jiān)聽器方法。

D们豌,動態(tài)代理模式涯捻。 擴(kuò)展JDK的ExtensionLoaderdeAdaptive實現(xiàn),根據(jù)調(diào)用階段動態(tài)參數(shù)決定調(diào)用哪個類望迎,生成代理類的代碼是ExtensionLoader的createAdaptiveExtenstionClassLoader方法障癌。

29,平衡二叉樹辩尊,左右高度之差不超過1涛浙,Add/delete可能造成高度>1,此時要旋轉(zhuǎn)对省,維持平衡狀態(tài)蝗拿,避免二叉樹退化為鏈表,讓Add/Delete時間復(fù)雜度但控制在O(log2N)蒿涎,旋轉(zhuǎn)算法2個方法哀托,1是求樹的高度,2是求2個高度最大值劳秋,1個空樹高度為-1仓手,只有1個根節(jié)點的樹的高度為0胖齐,以后每一層+1,平衡樹任意節(jié)點最多有2個兒子嗽冒,因此高度不平衡時呀伙,此節(jié)點的2棵子樹高度差為2。例如單旋轉(zhuǎn)添坊,雙旋轉(zhuǎn)剿另,插入等。

紅黑樹放棄完全平衡贬蛙,追求大致平衡雨女,保證每次插入最多要3次旋轉(zhuǎn)就能平衡。

30阳准,多線程同步鎖

A氛堕,RentrantLock,可重入的互斥鎖野蝇,可中斷可限時讼稚,公平鎖,必須在finally釋放鎖绕沈,而synchronize由JVM釋放锐想。可重入但是要重復(fù)退出乍狐,普通的lock()不能響應(yīng)中斷痛倚,lock.lockInterruptbly()可響應(yīng)中斷,可以限時tryLock()澜躺,超時返回false,不會永久等待構(gòu)成死鎖抒蚜。

B掘鄙,Confition條件變量,signal喚醒其中1個在等待的線程嗡髓,signalall喚醒所有在等待的線程await()等待并釋放鎖操漠,與lock結(jié)合使用。

C饿这,semaphore信號量浊伙,多個線程比(額度=10)進(jìn)入臨界區(qū),其他則阻塞在臨界區(qū)外长捧。

D嚣鄙,ReadWriteLock,讀讀不互斥串结,讀寫互斥哑子,寫寫互斥舅列。

E,CountDownLantch倒數(shù)計時器卧蜓,countdown()和await()

F帐要,CyCliBarrier

G,LockSupport弥奸,方法park和unpark

31榨惠,棧溢出的原因

是否遞歸的調(diào)用;大量循環(huán)盛霎;全局變量是否過多赠橙;數(shù)組,List摩渺,Map數(shù)據(jù)是否過大简烤;用DDMS工具檢查地方。

內(nèi)存溢出的原因

過多使用了static摇幻;static最好只用int和string等基本類型横侦;大量的遞歸或者死循環(huán);大數(shù)據(jù)項的查詢绰姻,如返回表的所有記錄枉侧,應(yīng)該采用分頁查詢。檢查是否有數(shù)組狂芋、List榨馁、map中存放的是對象的引用而不是對象,這些引用會讓對應(yīng)對象不能被釋放帜矾。

棧過大會導(dǎo)致內(nèi)存占用過多翼虫,頻繁頁交換阻礙效率。

32屡萤,說一下http/2

Http/2采用二進(jìn)制格式而不是文本

Http/2是完全多路復(fù)用的珍剑,而非有序并阻塞的。

Http/2使用報頭壓縮

Http/2讓服務(wù)器可以將響應(yīng)主動推送到客戶端緩存中死陆。

33招拙,說一下內(nèi)存泄露

A,HashMap,vector等容易(靜態(tài)集合類)措译, 和應(yīng)用程序生命周期一樣髓涯,所引用的所有對象Object也不能釋放猖败。

B泉褐,當(dāng)集合類里面的對象屬性被修改后蛤袒,再調(diào)用remove()不起作用,hashcode值發(fā)生了改變

C掠械,其對象add監(jiān)聽器由缆,但是往往釋放對象時忘記去刪除這些監(jiān)聽器

D注祖,各種連接記得關(guān)閉

E,內(nèi)部類的引用

F均唉,調(diào)用其他模塊是晨,對象作用參數(shù)

G,單例模式舔箭,持有外部對象引用無法收回罩缴。

內(nèi)存泄露例子

Vector<String> A = new Vector<String>();

for(int i = 0; i < 100; i++){

Object o = new Object ();

A.add(o);

o = null;

}

........

內(nèi)存溢出的例子

StringBuffer b = new StringBuffer ();

for(int i =0; i < 100; i++){

for(int j =0; i < 100; j++){

b.append(*);

}

}

34,SpirngMVC的生命周期 和 SpringBean的生命周期

SpirngMVC的生命周期 :

A层扶,DispatcherSerlvet(前端控制器)

B箫章,-》 HandlerMapping(處理器映射器),根據(jù)xml注解查找對應(yīng)的Hander -》 返回Handler

C镜会,-》處理器適配器去執(zhí)行Handler

D檬寂,-》Handler執(zhí)行完成后給處理器適配器返回ModelAndView

E,-》前端控制器請求視圖解析器去執(zhí)行視圖解析戳表,根據(jù)邏輯視圖名解析成真正的視圖JSP桶至,向前端控制器返回view

F,-》前端控制器進(jìn)行視圖渲染匾旭,將模型數(shù)據(jù)放到request-》返回給用戶

SpringBean的生命周期:

Instance實例化-》設(shè)置屬性值-》調(diào)用BeanNameAware的setBeanName方法-》調(diào)用BeanPostProsessor的預(yù)初始化方法-》調(diào)用InitializationBean的afterPropertiesSet()的方法-》調(diào)用定制的初始化方法callCustom的init-method-》調(diào)用BeanPostProsessor的后初始化方法-》Bean可以使用了 -》 容器關(guān)閉-》 調(diào)用DisposableBean的destroy方法-》調(diào)用定制的銷毀方法CallCustom的destroy-method镣屹。

35,AQS价涝,抽象隊列同步器

AQS定義2種資源共享方式:獨占與share共享

獨占:只能有1個線程運行

share共享:多個線程可以同p執(zhí)行如samphore/countdownlanch

AQS負(fù)責(zé)獲取共享state的入隊和/喚醒出隊等女蜈,AQS在頂層已經(jīng)實現(xiàn)好了,AQS有幾種方法:acquire()是獨占模式下線程共享資源的頂層入口色瘩,如獲取到資源伪窖,線程直接返回,否則進(jìn)入等待隊列居兆,直到獲取到資源為止惰许。tryAcquire()將線程加入等待隊列的尾部,并標(biāo)志為獨占史辙。acquireQueued()使線程在等待隊列中獲取資源,一直到獲取資源后不返回佩伤,如果過程被中斷也返回true聊倔,否則false。

線程在等待過程中被中斷是不響應(yīng)的生巡,獲取資源才補(bǔ)上中斷耙蔑。將線程添加到隊列尾部用了CAS自旋(死循環(huán)直到成功),類似于AutomicInteger的CAS自旋volatile變量孤荣。

start->tryAcquire -> 入隊 -> 找安全點 -> park等待狀態(tài) -> 當(dāng)前節(jié)點成對頭 -> End

36甸陌,單例模式的7種寫法

懶漢2種须揣,枚舉,餓漢2種钱豁,靜態(tài)內(nèi)部類耻卡,雙重校驗鎖(推薦)。

37牲尺,lucence倒排索引

三個文件:字典文件卵酪,頻率文件,位置文件谤碳。詞典文件不僅保存有每個關(guān)鍵詞溃卡,還保留了指向頻率文件和位置文件的指針,通過指針可以找到該關(guān)鍵字的頻率信息和位置信息蜒简。

field的概念瘸羡,用于表達(dá)信息所在位置(如標(biāo)題中,文章中搓茬,url中)犹赖,在建索引中,該field信息也記錄在詞典文件中垮兑,每個關(guān)鍵詞都有一個field信息(因為每個關(guān)鍵字一定屬于一個或多個field)冷尉。

關(guān)鍵字是按字符順序排列的(lucene沒有使用B樹結(jié)構(gòu)),因此lucene可以用二元搜索算法快速定位關(guān)鍵詞系枪。

假設(shè)要查詢單詞 “l(fā)ive”雀哨,lucene先對詞典二元查找、找到該詞私爷,通過指向頻率文件的指針讀出所有文章號雾棺,然后返回結(jié)果。詞典通常非常小衬浑,因而捌浩,整個過程的時間是毫秒級的。

對詞典文件中的關(guān)鍵詞進(jìn)行了壓縮工秩,關(guān)鍵詞壓縮為<前綴長度尸饺,后綴>,例如:當(dāng)前詞為“阿拉伯語”助币,上一個詞為“阿拉伯”浪听,那么“阿拉伯語”壓縮為<3,語>眉菱。對數(shù)字的壓縮迹栓,數(shù)字只保存與上一個值的差值。

38俭缓,ZooKeeper分布式高可用

ZooKeeper 運行期間克伊,集群中至少有過半的機(jī)器保存了最新數(shù)據(jù)酥郭。集群超過半數(shù)的機(jī)器能夠正常工作,集群就能夠?qū)ν馓峁┓?wù)愿吹。

zookeeper可以選出N臺機(jī)器作主機(jī)不从,它可以實現(xiàn)M:N的備份;keepalive只能選出1臺機(jī)器作主機(jī)洗搂,所以keepalive只能實現(xiàn)M:1的備份消返。

通常有以下兩種部署方案:雙機(jī)房部署(一個穩(wěn)定性更好、設(shè)備更可靠的機(jī)房耘拇,這個機(jī)房就是主要機(jī)房撵颊,而另外一個機(jī)房則更加廉價一些,例如惫叛,對于一個由 7 臺機(jī)器組成的 ZooKeeper 集群倡勇,通常在主要機(jī)房中部署 4 臺機(jī)器,剩下的 3 臺機(jī)器部署到另外一個機(jī)房中)嘉涌;三機(jī)房部署(無論哪個機(jī)房發(fā)生了故障妻熊,剩下兩個機(jī)房的機(jī)器數(shù)量都超過半數(shù)。在三個機(jī)房中都部署若干個機(jī)器來組成一個 ZooKeeper 集群仑最。假設(shè)機(jī)器總數(shù)為 N扔役,各機(jī)房機(jī)器數(shù):N1 = (N-1)/2 ,N2=1~(N-N1)/2 警医,N3 = N - N1 - N2 )亿胸。

水平擴(kuò)容就是向集群中添加更多機(jī)器,Zookeeper2種方式(不完美)预皇,一種是集群整體重啟侈玄,另外一種是逐臺進(jìn)行服務(wù)器的重啟。

39吟温,如何將數(shù)據(jù)分布在redis第幾個庫序仙?

答:redis 本身支持16個數(shù)據(jù)庫,通過 數(shù)據(jù)庫id 設(shè)置鲁豪,默認(rèn)為0潘悼。
例如jedis客戶端設(shè)置。一:JedisPool(org.apache.commons.pool.impl.GenericObjectPool.Config poolConfig, String host, int port, int timeout, String password, int database);
第一種通過指定構(gòu)造函數(shù)database字段選擇庫爬橡,不設(shè)置則默認(rèn)0庫挥等。二:jedis.select(index);調(diào)用jedis的select方法指定。

40堤尾,類加載器的雙親委派加載機(jī)制?

答:當(dāng)一個類收到了類加載請求迁客,他首先不會嘗試自己去加載這個類郭宝,而是把這個請求委派給父類去完成辞槐,每一個層次類加載器都是如此,因此所有的加載請求都應(yīng)該傳送到啟動類加載其中粘室,只有當(dāng)父類加載器反饋自己無法完成這個請求的時候(在它的加載路徑下沒有找到所需加載的Class)榄檬,子類加載器才會嘗試自己去加載。

41衔统,kafka高性能的原因鹿榜?

答:

A,Broker NIO異步消息處理锦爵,實現(xiàn)了IO線程與業(yè)務(wù)線程分離舱殿;

B,磁盤順序?qū)懀?/p>

C险掀, 零拷貝(跳過用戶緩沖區(qū)的拷貝沪袭,建立一個磁盤空間和內(nèi)存的直接映射,數(shù)據(jù)不再復(fù)制到用戶態(tài)緩沖區(qū))樟氢;

D冈绊,分區(qū)/分段(每次文件操作都是對一個小文件的操作,非常輕便埠啃,同時也增加了并行處理能力)死宣;

F,批量發(fā)送 (可以指定緩存的消息達(dá)到某個量的時候就發(fā)出去碴开,或者緩存了固定的時間后就發(fā)送出去毅该,大大減少服務(wù)端的I/O次數(shù))

E,數(shù)據(jù)壓縮

42叹螟,冪等的處理方式鹃骂?

答:一、查詢與刪除操作是天然冪等

二罢绽、唯一索引畏线,防止新增臟數(shù)據(jù)

三、token機(jī)制良价,防止頁面重復(fù)提交

四寝殴、悲觀鎖 for update

五、樂觀鎖(通過版本號/時間戳實現(xiàn)明垢, 通過條件限制where avai_amount-#subAmount# >= 0)

六蚣常、分布式鎖

七、狀態(tài)機(jī)冪等(如果狀態(tài)機(jī)已經(jīng)處于下一個狀態(tài)痊银,這時候來了一個上一個狀態(tài)的變更抵蚊,理論上是不能夠變更的,這樣的話,保證了有限狀態(tài)機(jī)的冪等贞绳。)

八谷醉、select + insert(并發(fā)不高的后臺系統(tǒng),或者一些任務(wù)JOB冈闭,為了支持冪等俱尼,支持重復(fù)執(zhí)行)

43,HTTPS工作流程萎攒?
a遇八、客戶端發(fā)送自己支持的加密規(guī)則給服務(wù)器,代表告訴服務(wù)器要進(jìn)行連接了
b耍休、服務(wù)器從中選出一套加密算法和hash算法以及自己的身份信息(地址等)以證書的形式發(fā)送給瀏覽器刃永,證書中包含服務(wù)器信息,加密公鑰羹应,證書的辦法機(jī)構(gòu)
c揽碘、客戶端收到網(wǎng)站的證書之后要做下面的事情:
c1、驗證證書的合法性
c2园匹、如果驗證通過證書雳刺,瀏覽器會生成一串隨機(jī)數(shù)作為密鑰K,并用證書中的公鑰進(jìn)行加密
c3裸违、用約定好的hash算法計算握手消息掖桦,然后用生成的密鑰K進(jìn)行加密,然后一起發(fā)送給服務(wù)器
d供汛、服務(wù)器接收到客戶端傳送來的信息枪汪,要求下面的事情:
d1、用私鑰解析出密碼怔昨,用密碼解析握手消息雀久,驗證hash值是否和瀏覽器發(fā)來的一致
d2、使用密鑰加密消息趁舀,回送
如果計算法hash值一致赖捌,握手成功

44,RabbitMQ消息堆積怎么處理矮烹?

答:

增加消費者的處理能力(例如優(yōu)化代碼)越庇,或減少發(fā)布頻率
單純升級硬件不是辦法,只能起到一時的作用
考慮使用隊列最大長度限制奉狈,RabbitMQ 3.1支持
給消息設(shè)置年齡卤唉,超時就丟棄
默認(rèn)情況下,rabbitmq消費者為單線程串行消費仁期,設(shè)置并發(fā)消費兩個關(guān)鍵屬性concurrentConsumers和prefetchCount桑驱,concurrentConsumers設(shè)置的是對每個listener在初始化的時候設(shè)置的并發(fā)消費者的個數(shù)竭恬,prefetchCount是每次一次性從broker里面取的待消費的消息的個數(shù)
建立新的queue,消費者同時訂閱新舊queue
生產(chǎn)者端緩存數(shù)據(jù)熬的,在mq被消費完后再發(fā)送到mq
打破發(fā)送循環(huán)條件萍聊,設(shè)置合適的qos值,當(dāng)qos值被用光悦析,而新的ack沒有被mq接收時,就可以跳出發(fā)送循環(huán)此衅,去接收新的消息强戴;消費者主動block接收進(jìn)程,消費者感受到接收消息過快時主動block挡鞍,利用block和unblock方法調(diào)節(jié)接收速率骑歹,當(dāng)接收線程被block時,跳出發(fā)送循環(huán)墨微。
45道媚,RabbitMQ的消息丟失解決方案?

答:

消息持久化:Exchange 設(shè)置持久化:durable:true翘县;Queue 設(shè)置持久化最域;Message持久化發(fā)送。
ACK確認(rèn)機(jī)制:消息發(fā)送確認(rèn)锈麸;消息接收確認(rèn)镀脂。
46,負(fù)載均衡算法忘伞?

常見6種負(fù)載均衡算法:輪詢薄翅,隨機(jī),源地址哈希氓奈,加權(quán)輪詢翘魄,加權(quán)隨機(jī),最小連接數(shù)舀奶。

nginx5種負(fù)載均衡算法:輪詢暑竟,weight,ip_hash伪节,fair(響應(yīng)時間)光羞,url_hash

dubbo負(fù)載均衡算法:隨機(jī),輪詢怀大,最少活躍調(diào)用數(shù)纱兑,一致性Hash

47,JVM內(nèi)存區(qū)域劃分化借?

答:

堆:Java中的堆是用來存儲對象本身的以及數(shù)組(當(dāng)然潜慎,數(shù)組引用是存放在Java棧中的),是Java垃圾收集器管理的主要區(qū)域。堆是被所有線程共享的铐炫,在JVM中只有一個堆垒手。
虛擬機(jī)棧:虛擬機(jī)棧中存放的是一個個的棧幀,每個棧幀對應(yīng)一個被調(diào)用的方法倒信,在棧幀中包括局部變量表科贬、操作數(shù)棧、指向當(dāng)前方法所屬的類的運行時常量池的引用鳖悠、方法返回地址和一些額外的附加信息榜掌。當(dāng)線程執(zhí)行一個方法時,就會隨之創(chuàng)建一個對應(yīng)的棧幀乘综,并將建立的棧幀壓棧憎账。當(dāng)方法執(zhí)行完畢之后,便會將棧幀出棧卡辰。
本地方法棧:本地方法棧則是為執(zhí)行本地方法(Native Method)服務(wù)的胞皱,在HotSopt虛擬機(jī)中直接就把本地方法棧和Java棧合二為一
方法區(qū):方法區(qū)與堆一樣,是被線程共享的區(qū)域九妈。方法區(qū)存儲了類的信息(包括類的名稱反砌、方法信息、字段信息)允蚣、靜態(tài)變量于颖、常量以及編譯器編譯后的代碼等。在方法區(qū)中有一個非常重要的部分就是運行時常量池嚷兔,它是每一個類或接口的常量池的運行時表示形式森渐,在類和接口被加載到JVM后,對應(yīng)的運行時常量池就被創(chuàng)建出來冒晰。當(dāng)然并非Class文件常量池中的內(nèi)容才能進(jìn)入運行時常量池同衣,在運行期間也可將新的常量放入運行時常量池中,比如String的intern方法壶运。當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時耐齐,則拋出OutOfMemoryError異常。在HotSpot虛擬機(jī)中蒋情,用永久代來實現(xiàn)方法區(qū)埠况,將GC分代收集擴(kuò)展至方法區(qū),但是這樣容易遇到內(nèi)存溢出的問題棵癣。JDK1.7中辕翰,已經(jīng)把放在永久代的字符串常量池移到堆中。JDK1.8撤銷永久代狈谊,引入元空間喜命。
程序計數(shù)器(線程私有):是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器沟沙,每條線程都要有一個獨立的程序計數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存壁榕。正在執(zhí)行java方法的話矛紫,計數(shù)器記錄的是虛擬機(jī)字節(jié)碼指令的地址(當(dāng)前指令的地址)。如果還是Native方法牌里,則為空颊咬。
直接內(nèi)存:在JDK1.4中新加入的NOI類,引入了一種基于通道與緩沖區(qū)的I/O方式牡辽,它可以使用Native函數(shù)直接分配堆外內(nèi)存贪染,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。
48催享,jvm YGC和FGC發(fā)生的具體場景?

答:

正在處理的實現(xiàn)事務(wù)功能哟绊,下次自動回滾因妙。

隊列實現(xiàn)持久化儲存,下次啟動自動載入票髓。

添加標(biāo)志位攀涵,未處理 0,處理中 1洽沟,已處理 2以故。每次啟動的時候,把所有狀態(tài)為 1 的裆操,置為 0怒详。

關(guān)鍵性的應(yīng)用就給電腦配個 UPS。

YGC :對新生代堆進(jìn)行g(shù)c踪区。頻率比較高昆烁,因為大部分對象的存活壽命較短,在新生代里被回收缎岗。性能耗費較小静尼。
FGC :全堆范圍的gc。默認(rèn)堆空間使用到達(dá)80%(可調(diào)整)的時候會觸發(fā)fgc传泊。以我們生產(chǎn)環(huán)境為例鼠渺,一般比較少會觸發(fā)fgc,有時10天或一周左右會有一次眷细。

YGC發(fā)生場景:edn空間不足
FGC發(fā)生場景:old空間不足拦盹,perm空間不足,調(diào)用方法System.gc() 薪鹦,ygc時的悲觀策略, dump live的內(nèi)存信息時(jmap –dump:live)

49掌敬,一個線程池正在處理服務(wù)如果忽然斷電該怎么辦惯豆?

答:

隊列實現(xiàn)持久化儲存,下次啟動自動載入奔害。
但是實際需要看情況楷兽,大體思路是這樣。
添加標(biāo)志位华临,未處理 0芯杀,處理中 1,已處理 2雅潭。每次啟動的時候揭厚,把所有狀態(tài)為 1 的,置為 0扶供∩冈玻或者定時器處理
關(guān)鍵性的應(yīng)用就給電腦配個 UPS。

50椿浓,SpringBoot的優(yōu)點太援?

答:

快速構(gòu)建項目,極大的提高了開發(fā)扳碍、部署效率提岔。
對主流開發(fā)框架的無配置集成。
項目可獨立運行笋敞,無須外部依賴Servlet容器碱蒙。
提供運行時的應(yīng)用監(jiān)控。

51夯巷,DoS赛惩,DDoS,DRDoS攻擊分別是什么趁餐?

答:DoS是Denial of Service的簡寫就是拒絕服務(wù)坊秸。

DDoS就是Distributed Denial of Service的簡寫就是分布式拒絕服務(wù)。

DRDoS就是Distributed Reflection Denial of Service的簡寫,分布反射式拒絕服務(wù)澎怒。

DoS褒搔、DDos以及DRDoS攻擊手段和防范措施
52,服務(wù)限流的方式喷面?

答:

漏桶:水(請求)先進(jìn)入到漏桶里,漏桶以一定的速度出水(接口有響應(yīng)速率),當(dāng)水流入速度過大會直接溢出(訪問頻率超過接口響應(yīng)速率),然后就拒絕請求星瘾。
令牌桶算法:系統(tǒng)會按恒定1/QPS時間間隔(如果QPS=100,則間隔是10ms)往桶里加入Token,如果桶已經(jīng)滿了就不再加了.新請求來臨時,會各自拿走一個Token,如果沒有Token就拒絕服務(wù)惧辈。
基于redis實現(xiàn)的限流:假設(shè)每分鐘訪問次數(shù)不能超過10次琳状,在Redis中創(chuàng)建一個鍵,過期60秒盒齿,對此服務(wù)接口的訪問就把鍵值加1念逞,在60秒內(nèi)增加到10的時候困食,禁止訪問服務(wù)接口。
計數(shù)器翎承,滑動窗口
53硕盹,Quartz實現(xiàn)原理?

答:A、scheduler是一個計劃調(diào)度器容器(總部)叨咖,容器里面可以盛放眾多的JobDetail和trigger瘩例,當(dāng)容器啟動后,里面的每個JobDetail都會根據(jù)trigger按部就班自動去執(zhí)行甸各。
B垛贤、JobDetail是一個可執(zhí)行的工作,它本身可能是有狀態(tài)的趣倾。
C聘惦、Trigger代表一個調(diào)度參數(shù)的配置,什么時候去調(diào)儒恋。
D部凑、當(dāng)JobDetail和Trigger在scheduler容器上注冊后,形成了裝配好的作業(yè)(JobDetail和Trigger所組成的一對兒)碧浊,就可以伴隨容器啟動而調(diào)度執(zhí)行了。
E瘟仿、scheduler是個容器箱锐,容器中有一個線程池,用來并行調(diào)度執(zhí)行每個作業(yè)劳较,這樣可以提高容器效率驹止。

54,數(shù)據(jù)庫的鎖观蜗?

答:行鎖(共享鎖和排他鎖)臊恋,表鎖,頁級鎖墓捻,頁級鎖抖仅,意向鎖,讀鎖砖第,寫鎖撤卢,悲觀鎖,樂觀鎖等

55梧兼,簡述ThreadPoolExecutor內(nèi)部工作原理放吩?

答:

先查看當(dāng)前運行狀態(tài),如果不是RUNNING 狀態(tài)會拒絕執(zhí)行任務(wù)羽杰,如果是RUNNING狀態(tài)渡紫,就會查看當(dāng)前運行的線程數(shù)量到推,如果小于核心線程數(shù),會創(chuàng)建新的線程來執(zhí)行這個任務(wù)惕澎,如果不小于核心線程莉测,會將這個任務(wù)放到阻塞隊列去等代執(zhí)行,直到上一個任務(wù)執(zhí)行完再來執(zhí)行這個任務(wù)集灌。如果失敗會創(chuàng)建一個非核心線程來執(zhí)行這個任務(wù)如果當(dāng)前線程數(shù)大于最大線程數(shù)悔雹,會直接拒絕該任務(wù)。

56欣喧,聚集索引和非聚集索引的區(qū)別腌零?

答:

聚集索引:
索引中鍵值的邏輯順序決定了表中相應(yīng)行的物理順序(索引中的數(shù)據(jù)物理存放地址和索引的順序是一致的),可以這么理解:只要是索引是連續(xù)的唆阿,那么數(shù)據(jù)在存儲介質(zhì)上的存儲位置也是連續(xù)的益涧。
比方說:想要到字典上查找一個字,我們可以根據(jù)字典前面的拼音找到該字驯鳖,注意拼音的排列時有順序的闲询。
聚集索引就像我們根據(jù)拼音的順序查字典一樣,可以大大的提高效率浅辙。在經(jīng)常搜索一定范圍的值時扭弧,通過索引找到第一條數(shù)據(jù),根據(jù)物理地址連續(xù)存儲的特點记舆,然后檢索相鄰的數(shù)據(jù)鸽捻,直到到達(dá)條件截至項。
非聚集索引
索引的邏輯順序與磁盤上的物理存儲順序不同泽腮。非聚集索引的鍵值在邏輯上也是連續(xù)的御蒲,但是表中的數(shù)據(jù)在存儲介質(zhì)上的物理順序是不一致的,即記錄的邏輯順序和實際存儲的物理順序沒有任何聯(lián)系诊赊。索引的記錄節(jié)點有一個數(shù)據(jù)指針指向真正的數(shù)據(jù)存儲位置厚满。
總結(jié)如下:
如果一個主鍵被定義了,那么這個主鍵就是作為聚集索引
如果沒有主鍵被定義碧磅,那么該表的第一個唯一非空索引被作為聚集索引
如果沒有主鍵也沒有合適的唯一索引碘箍,那么innodb內(nèi)部會生成一個隱藏的主鍵作為聚集索引,這個隱藏的主鍵是一個6個字節(jié)的列鲸郊,改列的值會隨著數(shù)據(jù)的插入自增敲街。
InnoDB引擎會為每張表都加一個聚集索引,而聚集索引指向的的數(shù)據(jù)又是以物理磁盤順序來存儲的严望,自增的主鍵會把數(shù)據(jù)自動向后插入多艇,避免了插入過程中的聚集索引排序問題。如果對聚集索引進(jìn)行排序像吻,這會帶來磁盤IO性能損耗是非常大的峻黍。

57复隆,java并發(fā)包下有哪些類?

答:ConcurrentHashMap姆涩,ConcurrentSkipListMap挽拂,ConcurrentNavigableMap

CopyOnWriteArrayList

BlockingQueue,BlockingDeque (ArrayBlockingQueue骨饿,LinkedBlockingDeque亏栈,LinkedBlockingQueue,DelayQueue宏赘,PriorityBlockingQueue绒北,SynchronousQueue)

ConcurrentLinkedDeque,ConcurrentLinkedQueue察署,TransferQueue闷游,LinkedTransferQueue

CopyOnWriteArraySet,ConcurrentSkipListSet

CyclicBarrier贴汪,CountDownLatch

Lock(ReetrantLock脐往,ReetrantReadWriteLock)

Atomic包

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扳埂,隨后出現(xiàn)的幾起案子业簿,更是在濱河造成了極大的恐慌,老刑警劉巖阳懂,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梅尤,死亡現(xiàn)場離奇詭異,居然都是意外死亡希太,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門酝蜒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊辉,“玉大人,你說我怎么就攤上這事亡脑《槌危” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵霉咨,是天一觀的道長蛙紫。 經(jīng)常有香客問我,道長途戒,這世上最難降的妖魔是什么坑傅? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮喷斋,結(jié)果婚禮上唁毒,老公的妹妹穿的比我還像新娘蒜茴。我一直安慰自己,他們只是感情好浆西,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布粉私。 她就那樣靜靜地躺著,像睡著了一般近零。 火紅的嫁衣襯著肌膚如雪诺核。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天久信,我揣著相機(jī)與錄音窖杀,去河邊找鬼。 笑死入篮,一個胖子當(dāng)著我的面吹牛陈瘦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潮售,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼痊项,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酥诽?” 一聲冷哼從身側(cè)響起鞍泉,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肮帐,沒想到半個月后咖驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡训枢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年托修,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恒界。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡睦刃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出十酣,到底是詐尸還是另有隱情涩拙,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布耸采,位于F島的核電站兴泥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虾宇。R本人自食惡果不足惜搓彻,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧好唯,春花似錦竭沫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至靶端,卻和暖如春谎势,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杨名。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工脏榆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留离陶,地道東北人旺韭。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓骗卜,卻偏偏與公主長得像黔攒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萧朝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容