本文是銜接上文(史上最全的Java面試題總匯又固,不再懼怕面試官仲器,成功坐等offer)的帶答案版本,答案已經(jīng)整理完畢仰冠。希望大家采納乏冀。
本文內(nèi)容偏多,建議收藏閱讀洋只。 小編整理不易辆沦,給個(gè)關(guān)注吧~
十四、RabbitMQ
135.rabbitmq 的使用場(chǎng)景有哪些识虚?
搶購(gòu)活動(dòng)肢扯,削峰填谷,防止系統(tǒng)崩塌担锤。 延遲信息處理蔚晨,比如 10 分鐘之后給下單未付款的用戶(hù)發(fā)送郵件提醒。
解耦系統(tǒng)肛循,對(duì)于新增的功能可以單獨(dú)寫(xiě)模塊擴(kuò)展铭腕,比如用戶(hù)確認(rèn)評(píng)價(jià)之后,新增了給用戶(hù)返積分的功能育拨,這個(gè)時(shí)候不用在業(yè)務(wù)代碼里添加新增積分的功能谨履,只需要把新增積分的接口訂閱確認(rèn)評(píng)價(jià)的消息隊(duì)列即可,后面再添加任何功能只需要訂閱對(duì)應(yīng)的消息隊(duì)列即可熬丧。
136.rabbitmq 有哪些重要的角色笋粟?
生產(chǎn)者:消息的創(chuàng)建者怀挠,負(fù)責(zé)創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器;
消費(fèi)者:消息的接收方害捕,用于處理數(shù)據(jù)和確認(rèn)消息绿淋;
代理:就是 RabbitMQ 本身,用于扮演“快遞”的角色尝盼,本身不生產(chǎn)消息吞滞,只是扮演“快遞”的角色。
137.rabbitmq 有哪些重要的組件盾沫?
ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器裁赠,程序代碼中使用。
Channel(信道):消息推送使用的通道赴精。
Exchange(交換器):用于接受佩捞、分配消息。
Queue(隊(duì)列):用于存儲(chǔ)生產(chǎn)者的消息蕾哟。
RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上一忱。
?BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上。
138.rabbitmq 中 vhost 的作用是什么谭确?
vhost:每個(gè) RabbitMQ 都能創(chuàng)建很多 vhost帘营,我們稱(chēng)之為虛擬主機(jī),每個(gè)虛擬主機(jī)其實(shí)都是 mini 版的RabbitMQ逐哈,它擁有自己的隊(duì)列芬迄,交換器和綁定,擁有自己的權(quán)限機(jī)制鞠眉。
139.rabbitmq 的消息是怎么發(fā)送的薯鼠?
首先客戶(hù)端必須連接到 RabbitMQ 服務(wù)器才能發(fā)布和消費(fèi)消息,客戶(hù)端和 rabbit server 之間會(huì)創(chuàng)建一個(gè) tcp 連接械蹋,一旦 tcp 打開(kāi)并通過(guò)了認(rèn)證(認(rèn)證就是你發(fā)送給 rabbit 服務(wù)器的用戶(hù)名和密碼)出皇,你的客戶(hù)端和 RabbitMQ 就創(chuàng)建了一條 amqp 信道(channel),信道是創(chuàng)建在“真實(shí)” tcp 上的虛擬連接哗戈,amqp 命令都是通過(guò)信道發(fā)送出去的郊艘,每個(gè)信道都會(huì)有一個(gè)唯一的 id,不論是發(fā)布消息唯咬,訂閱隊(duì)列都是通過(guò)這個(gè)信道完成的纱注。
140.rabbitmq 怎么保證消息的穩(wěn)定性?
提供了事務(wù)的功能胆胰。 通過(guò)將 channel 設(shè)置為 confirm(確認(rèn))模式狞贱。
141.rabbitmq 怎么避免消息丟失?
把消息持久化磁盤(pán)蜀涨,保證服務(wù)器重啟消息不丟失瞎嬉。 每個(gè)集群中至少有一個(gè)物理磁盤(pán)蝎毡,保證消息落入磁盤(pán)。
142.要保證消息持久化成功的條件有哪些氧枣?
聲明隊(duì)列必須設(shè)置持久化 durable 設(shè)置為 true.
消息推送投遞模式必須設(shè)置持久化沐兵,deliveryMode 設(shè)置為 2(持久)。
消息已經(jīng)到達(dá)持久化交換器便监。
消息已經(jīng)到達(dá)持久化隊(duì)列扎谎。
?以上四個(gè)條件都滿(mǎn)足才能保證消息持久化成功。
143.rabbitmq 持久化有什么缺點(diǎn)烧董?
持久化的缺地就是降低了服務(wù)器的吞吐量毁靶,因?yàn)槭褂玫氖谴疟P(pán)而非內(nèi)存存儲(chǔ),從而降低了吞吐量解藻±铣洌可盡量使用 ssd 硬盤(pán)來(lái)緩解吞吐量的問(wèn)題。
144.rabbitmq 有幾種廣播類(lèi)型螟左?
direct(默認(rèn)方式):最基礎(chǔ)最簡(jiǎn)單的模式,發(fā)送方把消息發(fā)送給訂閱方觅够,如果有多個(gè)訂閱者胶背,默認(rèn)采取輪詢(xún)的方式進(jìn)行消息發(fā)送。
headers:與 direct 類(lèi)似喘先,只是性能很差钳吟,此類(lèi)型幾乎用不到。
fanout:分發(fā)模式窘拯,把消費(fèi)分發(fā)給所有訂閱者红且。
topic:匹配訂閱模式,使用正則匹配到消息隊(duì)列涤姊,能匹配到的都能接收到暇番。
145.rabbitmq 怎么實(shí)現(xiàn)延遲消息隊(duì)列?
通過(guò)消息過(guò)期后進(jìn)入死信交換器思喊,再由交換器轉(zhuǎn)發(fā)到延遲消費(fèi)隊(duì)列壁酬,實(shí)現(xiàn)延遲功能; 使用 RabbitMQ-delayed-message-exchange 插件實(shí)現(xiàn)延遲功能恨课。
146.rabbitmq 集群有什么用舆乔?
高可用:某個(gè)服務(wù)器出現(xiàn)問(wèn)題,整個(gè) RabbitMQ 還可以繼續(xù)使用剂公;
高容量:集群可以承載更多的消息量希俩。
147.rabbitmq 節(jié)點(diǎn)的類(lèi)型有哪些?
磁盤(pán)節(jié)點(diǎn):消息會(huì)存儲(chǔ)到磁盤(pán)纲辽。
內(nèi)存節(jié)點(diǎn):消息都存儲(chǔ)在內(nèi)存中颜武,重啟服務(wù)器消息丟失璃搜,性能高于磁盤(pán)類(lèi)型。
148.rabbitmq 集群搭建需要注意哪些問(wèn)題盒刚?
各節(jié)點(diǎn)之間使用“--link”連接腺劣,此屬性不能忽略。 各節(jié)點(diǎn)使用的 erlang cookie 值必須相同因块,此值相當(dāng)于“秘鑰”的功能橘原,用于各節(jié)點(diǎn)的認(rèn)證。 整個(gè)集群中必須包含一個(gè)磁盤(pán)節(jié)點(diǎn)涡上。
149.rabbitmq 每個(gè)節(jié)點(diǎn)是其他節(jié)點(diǎn)的完整拷貝嗎趾断?為什么?
存儲(chǔ)空間的考慮:如果每個(gè)節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝吩愧,這樣新增節(jié)點(diǎn)不但沒(méi)有新增存儲(chǔ)空間芋酌,反而增加了更多的冗余數(shù)據(jù);
性能的考慮:如果每條消息都需要完整拷貝到每一個(gè)集群節(jié)點(diǎn)雁佳,那新增節(jié)點(diǎn)并沒(méi)有提升處理消息的能力脐帝,最多是保持和單節(jié)點(diǎn)相同的性能甚至是更糟。
150.rabbitmq 集群中唯一一個(gè)磁盤(pán)節(jié)點(diǎn)崩潰了會(huì)發(fā)生什么情況糖权?
如果唯一磁盤(pán)的磁盤(pán)節(jié)點(diǎn)崩潰了堵腹,不能進(jìn)行以下操作:
不能創(chuàng)建隊(duì)列
不能創(chuàng)建交換器
不能創(chuàng)建綁定
不能添加用戶(hù)
不能更改權(quán)限
不能添加和刪除集群節(jié)點(diǎn)
唯一磁盤(pán)節(jié)點(diǎn)崩潰了,集群是可以保持運(yùn)行的星澳,但你不能更改任何東西疚顷。
151.rabbitmq 對(duì)集群節(jié)點(diǎn)停止順序有要求嗎?
RabbitMQ 對(duì)集群的停止的順序是有要求的禁偎,應(yīng)該先關(guān)閉內(nèi)存節(jié)點(diǎn)腿堤,最后再關(guān)閉磁盤(pán)節(jié)點(diǎn)。如果順序恰好相反的話(huà)如暖,可能會(huì)造成消息的丟失笆檀。
十五、Kafka
152.kafka 可以脫離 zookeeper 單獨(dú)使用嗎装处?為什么误债?
kafka 不能脫離 zookeeper 單獨(dú)使用,因?yàn)?kafka 使用 zookeeper 管理和協(xié)調(diào) kafka 的節(jié)點(diǎn)服務(wù)器妄迁。
153.kafka 有幾種數(shù)據(jù)保留的策略寝蹈?
kafka 有兩種數(shù)據(jù)保存策略:按照過(guò)期時(shí)間保留和按照存儲(chǔ)的消息大小保留。
154.kafka 同時(shí)設(shè)置了 7 天和 10G 清除數(shù)據(jù)登淘,到第五天的時(shí)候消息達(dá)到了 10G箫老,這個(gè)時(shí)候 kafka 將如何處理?
這個(gè)時(shí)候 kafka 會(huì)執(zhí)行數(shù)據(jù)清除工作黔州,時(shí)間和大小不論那個(gè)滿(mǎn)足條件耍鬓,都會(huì)清空數(shù)據(jù)阔籽。
155.什么情況會(huì)導(dǎo)致 kafka 運(yùn)行變慢?
cpu 性能瓶頸
磁盤(pán)讀寫(xiě)瓶頸
?網(wǎng)絡(luò)瓶頸
156.使用 kafka 集群需要注意什么牲蜀?
集群的數(shù)量不是越多越好笆制,最好不要超過(guò) 7 個(gè),因?yàn)楣?jié)點(diǎn)越多涣达,消息復(fù)制需要的時(shí)間就越長(zhǎng)在辆,整個(gè)群組的吞吐量就越低。
集群數(shù)量最好是單數(shù)度苔,因?yàn)槌^(guò)一半故障集群就不能用了匆篓,設(shè)置為單數(shù)容錯(cuò)率更高。
十六寇窑、Zookeeper
157.zookeeper 是什么鸦概?
zookeeper 是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)甩骏,是 google chubby 的開(kāi)源實(shí)現(xiàn)窗市,是 hadoop 和 hbase 的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件饮笛,提供的功能包括:配置維護(hù)谨设、域名服務(wù)、分布式同步缎浇、組服務(wù)等。
158. zookeeper 都有哪些功能赴肚?
集群管理:監(jiān)控節(jié)點(diǎn)存活狀態(tài)素跺、運(yùn)行請(qǐng)求等。
主節(jié)點(diǎn)選舉:主節(jié)點(diǎn)掛掉了之后可以從備用的節(jié)點(diǎn)開(kāi)始新一輪選主誉券,主節(jié)點(diǎn)選舉說(shuō)的就是這個(gè)選舉的過(guò)程指厌,使用 zookeeper 可以協(xié)助完成這個(gè)過(guò)程。
分布式鎖:zookeeper 提供兩種鎖:獨(dú)占鎖踊跟、共享鎖踩验。獨(dú)占鎖即一次只能有一個(gè)線(xiàn)程使用資源,共享鎖是讀鎖共享商玫,讀寫(xiě)互斥箕憾,即可以有多線(xiàn)線(xiàn)程同時(shí)讀同一個(gè)資源,如果要使用寫(xiě)鎖也只能有一個(gè)線(xiàn)程使用拳昌。zookeeper可以對(duì)分布式鎖進(jìn)行控制袭异。
命名服務(wù):在分布式系統(tǒng)中,通過(guò)使用命名服務(wù)炬藤,客戶(hù)端應(yīng)用能夠根據(jù)指定名字來(lái)獲取資源或服務(wù)的地址御铃,提供者等信息碴里。
159. zookeeper 有幾種部署模式?
zookeeper 有三種部署模式:
單機(jī)部署:一臺(tái)集群上運(yùn)行上真;
集群部署:多臺(tái)集群運(yùn)行咬腋;
偽集群部署:一臺(tái)集群?jiǎn)?dòng)多個(gè) zookeeper 實(shí)例運(yùn)行。
160.zookeeper 怎么保證主從節(jié)點(diǎn)的狀態(tài)同步睡互?
zookeeper 的核心是原子廣播根竿,這個(gè)機(jī)制保證了各個(gè) server 之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做 zab 協(xié)議湃缎。 zab 協(xié)議有兩種模式犀填,分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后嗓违,zab 就進(jìn)入了恢復(fù)模式九巡,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù) server 完成了和 leader 的狀態(tài)同步以后蹂季,恢復(fù)模式就結(jié)束了冕广。狀態(tài)同步保證了 leader 和 server 具有相同的系統(tǒng)狀態(tài)。
161. 集群中為什么要有主節(jié)點(diǎn)偿洁?
在分布式環(huán)境中撒汉,有些業(yè)務(wù)邏輯只需要集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其他的機(jī)器可以共享這個(gè)結(jié)果涕滋,這樣可以大大減少重復(fù)計(jì)算睬辐,提高性能碰缔,所以就需要主節(jié)點(diǎn)硬毕。
162. 集群中有 3 臺(tái)服務(wù)器敬拓,其中一個(gè)節(jié)點(diǎn)宕機(jī)设哗,這個(gè)時(shí)候 zookeeper 還可以使用嗎禀晓?
可以繼續(xù)使用构灸,單數(shù)服務(wù)器只要沒(méi)超過(guò)一半的服務(wù)器宕機(jī)就可以繼續(xù)使用澜躺。
163. 說(shuō)一下 zookeeper 的通知機(jī)制瞒斩?
客戶(hù)端端會(huì)對(duì)某個(gè) znode 建立一個(gè) watcher 事件增拥,當(dāng)該 znode 發(fā)生變化時(shí)啄巧,這些客戶(hù)端會(huì)收到 zookeeper 的通知,然后客戶(hù)端可以根據(jù) znode 變化來(lái)做出業(yè)務(wù)上的改變掌栅。
十七秩仆、MySql
164.數(shù)據(jù)庫(kù)的三范式是什么?
第一范式:強(qiáng)調(diào)的是列的原子性渣玲,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)逗概。
第二范式:要求實(shí)體的屬性完全依賴(lài)于主關(guān)鍵字。所謂完全依賴(lài)是指不能存在僅依賴(lài)主關(guān)鍵字一部分的屬性。
第三范式:任何非主屬性不依賴(lài)于其它非主屬性逾苫。
165.一張自增表里面總共有 7 條數(shù)據(jù)卿城,刪除了最后 2 條數(shù)據(jù),重啟 mysql 數(shù)據(jù)庫(kù)铅搓,又插入了一條數(shù)據(jù)瑟押,此時(shí) id 是幾?
表類(lèi)型如果是 MyISAM 星掰,那 id 就是 8多望。
表類(lèi)型如果是 InnoDB,那 id 就是 6氢烘。
166.如何獲取當(dāng)前數(shù)據(jù)庫(kù)版本怀偷?
使用 select version() 獲取當(dāng)前 MySQL 數(shù)據(jù)庫(kù)版本。 select version()
167.說(shuō)一下 ACID 是什么播玖?
Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作椎工,或者全部完成,或者全部不完成蜀踏,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)维蒙。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)(Rollback)到事務(wù)開(kāi)始前的狀態(tài)果覆,就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣颅痊。即,事務(wù)不可分割局待、不可約簡(jiǎn)斑响。
Consistency(一致性):在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞钳榨。這表示寫(xiě)入的資料必須完全符合所有的預(yù)設(shè)約束恋捆、觸發(fā)器、級(jí)聯(lián)回滾等重绷。
Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫(xiě)和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致膜毁。事務(wù)隔離分為不同級(jí)別昭卓,包括讀未提交(Read uncommitted)、讀提交(read committed)瘟滨、可重復(fù)讀(repeatable read)和串行化(Serializable)候醒。
Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的杂瘸,即便系統(tǒng)故障也不會(huì)丟失倒淫。
168.char 和 varchar 的區(qū)別是什么?
char(n) :固定長(zhǎng)度類(lèi)型败玉,比如訂閱 char(10)敌土,當(dāng)你輸入"abc"三個(gè)字符的時(shí)候镜硕,它們占的空間還是 10 個(gè)字節(jié),其他 7 個(gè)是空字節(jié)返干。
chat 優(yōu)點(diǎn):效率高兴枯;缺點(diǎn):占用空間;適用場(chǎng)景:存儲(chǔ)密碼的 md5 值矩欠,固定長(zhǎng)度的财剖,使用 char 非常合適。
varchar(n) :可變長(zhǎng)度癌淮,存儲(chǔ)的值是每個(gè)值占用的字節(jié)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)的長(zhǎng)度躺坟。
所以,從空間上考慮 varcahr 比較合適乳蓄;從效率上考慮 char 比較合適咪橙,二者使用需要權(quán)衡
169.float 和 double 的區(qū)別是什么?
float 最多可以存儲(chǔ) 8 位的十進(jìn)制數(shù)栓袖,并在內(nèi)存中占 4 字節(jié)匣摘。 double 最可可以存儲(chǔ) 16 位的十進(jìn)制數(shù),并在內(nèi)存中占 8 字節(jié)裹刮。
170.mysql 的內(nèi)連接音榜、左連接、右連接有什么區(qū)別捧弃?
內(nèi)連接關(guān)鍵字:inner join赠叼;左連接:left join;右連接:right join违霞。 內(nèi)連接是把匹配的關(guān)聯(lián)數(shù)據(jù)顯示出來(lái)嘴办;左連接是左邊的表全部顯示出來(lái),右邊的表顯示出符合條件的數(shù)據(jù)买鸽;右連接正好相反涧郊。
171.mysql 索引是怎么實(shí)現(xiàn)的?
索引是滿(mǎn)足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu)眼五,而這些數(shù)據(jù)結(jié)構(gòu)會(huì)以某種方式指向數(shù)據(jù)妆艘,從而實(shí)現(xiàn)高效查找數(shù)據(jù)。 具體來(lái)說(shuō) MySQL 中的索引看幼,不同的數(shù)據(jù)引擎實(shí)現(xiàn)有所不同批旺,但目前主流的數(shù)據(jù)庫(kù)引擎的索引都是 B+ 樹(shù)實(shí)現(xiàn)的,B+ 樹(shù)的搜索效率诵姜,可以到達(dá)二分法的性能汽煮,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu)了,所有索引的性能也是更好的。
172.怎么驗(yàn)證 mysql 的索引是否滿(mǎn)足需求暇赤?
使用 explain 查看 SQL 是如何執(zhí)行查詢(xún)語(yǔ)句的心例,從而分析你的索引是否滿(mǎn)足需求。
explain 語(yǔ)法:
explain select * from table where type=1
173.說(shuō)一下數(shù)據(jù)庫(kù)的事務(wù)隔離翎卓?
MySQL 的事務(wù)隔離是在 MySQL. ini 配置文件里添加的契邀,在文件的最后添加:
transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED失暴、REPEATABLE-READ坯门、SERIALIZABLE。
READ-UNCOMMITTED:未提交讀逗扒,最低隔離級(jí)別古戴、事務(wù)未提交前,就可被其他事務(wù)讀染丶纭(會(huì)出現(xiàn)幻讀现恼、臟讀、不可重復(fù)讀)黍檩。 READ-COMMITTED:提交讀叉袍,一個(gè)事務(wù)提交后才能被其他事務(wù)讀取到(會(huì)造成幻讀、不可重復(fù)讀)刽酱。
REPEATABLE-READ:可重復(fù)讀喳逛,默認(rèn)級(jí)別,保證多次讀取同一個(gè)數(shù)據(jù)時(shí)棵里,其值都和事務(wù)開(kāi)始時(shí)候的內(nèi)容是一致润文,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會(huì)造成幻讀)。
SERIALIZABLE:序列化殿怜,代價(jià)最高最可靠的隔離級(jí)別典蝌,該隔離級(jí)別能防止臟讀、不可重復(fù)讀头谜、幻讀骏掀。
臟讀 :表示一個(gè)事務(wù)能夠讀取另一個(gè)事務(wù)中還未提交的數(shù)據(jù)。比如柱告,某個(gè)事務(wù)嘗試插入記錄 A砖织,此時(shí)該事務(wù)還未提交,然后另一個(gè)事務(wù)嘗試讀取到了記錄 A末荐。 不可重復(fù)讀 :是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)新锈。
幻讀 :指同一個(gè)事務(wù)內(nèi)多次查詢(xún)返回的結(jié)果集不一樣甲脏。比如同一個(gè)事務(wù) A 第一次查詢(xún)時(shí)候有 n 條記錄,但是第二次同等條件下查詢(xún)卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺(jué)块请。發(fā)生幻讀的原因也是另外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù)娜氏,同一個(gè)記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了
174.說(shuō)一下 mysql 常用的引擎墩新?
?InnoDB 引擎:InnoDB 引擎提供了對(duì)數(shù)據(jù)庫(kù) acid 事務(wù)的支持贸弥,并且還提供了行級(jí)鎖和外鍵的約束,它的設(shè)計(jì)的目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫(kù)系統(tǒng)海渊。MySQL 運(yùn)行的時(shí)候绵疲,InnoDB 會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引臣疑。但是該引擎是不支持全文搜索盔憨,同時(shí)啟動(dòng)也比較的慢,它是不會(huì)保存表的行數(shù)的讯沈,所以當(dāng)進(jìn)行 select count(*) from table 指令的時(shí)候郁岩,需要進(jìn)行掃描全表。由于鎖的粒度小缺狠,寫(xiě)操作是不會(huì)鎖定全表的,所以在并發(fā)度較高的場(chǎng)景下使用會(huì)提升效率
MyIASM 引擎:MySQL 的默認(rèn)引擎问慎,但不提供事務(wù)的支持,也不支持行級(jí)鎖和外鍵挤茄。因此當(dāng)執(zhí)行插入和更新語(yǔ)句時(shí)如叼,即執(zhí)行寫(xiě)操作的時(shí)候需要鎖定這個(gè)表,所以會(huì)導(dǎo)致效率會(huì)降低驮樊。不過(guò)和 InnoDB 不同的是薇正,MyIASM 引擎是保存了表的行數(shù),于是當(dāng)進(jìn)行 select count(*) from table 語(yǔ)句時(shí)囚衔,可以直接的讀取已經(jīng)保存的值而不需要進(jìn)行掃描全表挖腰。所以,如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作時(shí)练湿,并且不需要事務(wù)的支持的猴仑,可以將 MyIASM 作為數(shù)據(jù)庫(kù)引擎的首選
175.說(shuō)一下 mysql 的行鎖和表鎖?
?MyISAM 只支持表鎖肥哎,InnoDB 支持表鎖和行鎖辽俗,默認(rèn)為行鎖
表級(jí)鎖:開(kāi)銷(xiāo)小,加鎖快篡诽,不會(huì)出現(xiàn)死鎖崖飘。鎖定粒度大,發(fā)生鎖沖突的概率最高杈女,并發(fā)量最低
行級(jí)鎖:開(kāi)銷(xiāo)大朱浴,加鎖慢吊圾,會(huì)出現(xiàn)死鎖。鎖力度小翰蠢,發(fā)生鎖沖突的概率小项乒,并發(fā)度最高
176.說(shuō)一下樂(lè)觀鎖和悲觀鎖?
樂(lè)觀鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改梁沧,所以不會(huì)上鎖檀何,但是在提交更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù)
悲觀鎖:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖廷支,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)阻止频鉴,直到這個(gè)鎖被釋放
數(shù)據(jù)庫(kù)的樂(lè)觀鎖需要自己實(shí)現(xiàn),在表里面添加一個(gè) version 字段酥泞,每次修改成功值加 1砚殿,這樣每次修改的時(shí)候先對(duì)比一下,自己擁有的 version 和數(shù)據(jù)庫(kù)現(xiàn)在的 version 是否一致芝囤,如果不一致就不修改似炎,這樣就實(shí)現(xiàn)了樂(lè)觀鎖。
177.mysql 問(wèn)題排查都有哪些手段悯姊?
使用 show processlist 命令查看當(dāng)前所有連接信息
使用 explain 命令查詢(xún) SQL 語(yǔ)句執(zhí)行計(jì)劃
開(kāi)啟慢查詢(xún)?nèi)罩鞠勖辏榭绰樵?xún)的 SQL
為搜索字段創(chuàng)建索引
避免使用 select *悯许,列出需要查詢(xún)的字段
垂直分割分表
選擇正確的存儲(chǔ)引擎
十八仆嗦、Redis
179.redis 是什么?都有哪些使用場(chǎng)景先壕?
Redis 是一個(gè)使用 C 語(yǔ)言開(kāi)發(fā)的高速緩存數(shù)據(jù)庫(kù)瘩扼。
Redis 使用場(chǎng)景: 記錄帖子點(diǎn)贊數(shù)、點(diǎn)擊數(shù)垃僚、評(píng)論數(shù)集绰; 緩存近期熱帖; 緩存文章詳情信息谆棺; 記錄用戶(hù)會(huì)話(huà)信息栽燕。
180. Redis 有哪些功能?
數(shù)據(jù)緩存功能
分布式鎖的功能
支持?jǐn)?shù)據(jù)持久化
支持事務(wù)
支持消息隊(duì)列
181. Redis 和 memcache 有什么區(qū)別改淑?
存儲(chǔ)方式不同:memcache 把數(shù)據(jù)全部存在內(nèi)存之中碍岔,斷電后會(huì)掛掉,數(shù)據(jù)不能超過(guò)內(nèi)存大卸湎摹蔼啦;Redis 有部份存在硬盤(pán)上,這樣能保證數(shù)據(jù)的持久性仰猖。
數(shù)據(jù)支持類(lèi)型:memcache 對(duì)數(shù)據(jù)類(lèi)型支持相對(duì)簡(jiǎn)單捏肢;Redis 有復(fù)雜的數(shù)據(jù)類(lèi)型掠河。
使用底層模型不同:它們之間底層實(shí)現(xiàn)方式,以及與客戶(hù)端之間通信的應(yīng)用協(xié)議不一樣猛计,Redis 自己構(gòu)建了 vm 機(jī)制,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話(huà)爆捞,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求奉瘤。
value 值大小不同:Redis 最大可以達(dá)到 512mb;memcache 只有 1mb煮甥。
182.redis 為什么是單線(xiàn)程的盗温?
因?yàn)?cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是機(jī)器內(nèi)存或者網(wǎng)絡(luò)帶寬成肘。既然單線(xiàn)程容易實(shí)現(xiàn)卖局,而且 cpu 又不會(huì)成為瓶頸,那就順理成章地采用單線(xiàn)程的方案了双霍。
關(guān)于 Redis 的性能砚偶,官方網(wǎng)站也有,普通筆記本輕松處理每秒幾十萬(wàn)的請(qǐng)求洒闸。 而且單線(xiàn)程并不代表就慢 nginx 和 nodejs 也都是高性能單線(xiàn)程的代表染坯。
183. 什么是緩存穿透?怎么解決丘逸?
緩存穿透:指查詢(xún)一個(gè)一定不存在的數(shù)據(jù)单鹿,由于緩存是不命中時(shí)需要從數(shù)據(jù)庫(kù)查詢(xún),查不到數(shù)據(jù)則不寫(xiě)入緩存深纲,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫(kù)去查詢(xún)仲锄,造成緩存穿透。
解決方案:最簡(jiǎn)單粗暴的方法如果一個(gè)查詢(xún)返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在湃鹊,還是系統(tǒng)故障)儒喊,我們就把這個(gè)空結(jié)果進(jìn)行緩存,但它的過(guò)期時(shí)間會(huì)很短涛舍,最長(zhǎng)不超過(guò)五分鐘澄惊。
184. Redis 支持的數(shù)據(jù)類(lèi)型有哪些?
Redis 支持的數(shù)據(jù)類(lèi)型:string(字符串)富雅、list(列表)掸驱、hash(散列表)、set(集合)没佑、zset(有序集合)毕贼。
185. Redis 支持的 Java 客戶(hù)端都有哪些?
支持的 Java 客戶(hù)端有 Redisson蛤奢、jedis鬼癣、lettuce 等陶贼。
186.jedis 和 redisson 有哪些區(qū)別?
?jedis:提供了比較全面的 Redis 命令的支持待秃。
Redisson:實(shí)現(xiàn)了分布式和可擴(kuò)展的 Java 數(shù)據(jù)結(jié)構(gòu)拜秧,與 jedis 相比 Redisson 的功能相對(duì)簡(jiǎn)單,不支持排序章郁、事務(wù)枉氮、管道、分區(qū)等 Redis 特性暖庄。
187. 怎么保證緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性聊替?
合理設(shè)置緩存的過(guò)期時(shí)間。 新增培廓、更改惹悄、刪除數(shù)據(jù)庫(kù)操作時(shí)同步更新 Redis,可以使用事物機(jī)制來(lái)保證數(shù)據(jù)的一致性肩钠。
188. Redis 持久化有幾種方式泣港?
Redis 的持久化有兩種方式,或者說(shuō)有兩種策略:
RDB(Redis Database):指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)進(jìn)行快照存儲(chǔ)蔬将。
AOF(Append Only File):每一個(gè)收到的寫(xiě)命令都通過(guò)write函數(shù)追加到文件中爷速。
189. Redis 怎么實(shí)現(xiàn)分布式鎖?
Redis 分布式鎖其實(shí)就是在系統(tǒng)里面占一個(gè)“坑”霞怀,其他程序也要占“坑”的時(shí)候惫东,占用成功了就可以繼續(xù)執(zhí)行,失敗了就只能放棄或稍后重試毙石。 占坑一般使用 setnx(set if not exists)指令廉沮,只允許被一個(gè)程序占有,使用完調(diào)用 del 釋放鎖徐矩。
190. Redis 分布式鎖有什么缺陷滞时?
Redis 分布式鎖不能解決超時(shí)的問(wèn)題,分布式鎖有一個(gè)超時(shí)時(shí)間滤灯,程序的執(zhí)行如果超出了鎖的超時(shí)時(shí)間就會(huì)出現(xiàn)問(wèn)題坪稽。
191. Redis 如何做內(nèi)存優(yōu)化?
盡量使用 Redis 的散列表鳞骤,把相關(guān)的信息放到散列表里面存儲(chǔ)窒百,而不是把每個(gè)字段單獨(dú)存儲(chǔ),這樣可以有效的減少內(nèi)存使用豫尽。比如將 Web 系統(tǒng)的用戶(hù)對(duì)象篙梢,應(yīng)該放到散列表里面再整體存儲(chǔ)到 Redis,而不是把用戶(hù)的姓名美旧、年齡渤滞、密碼贬墩、郵箱等字段分別設(shè)置 key 進(jìn)行存儲(chǔ)。
192. Redis 淘汰策略有哪些妄呕?
volatile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server. db[i]. expires)中挑選最近最少使用的數(shù)據(jù)淘汰陶舞。
volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server. db[i]. expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰。
volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server. db[i]. expires)中任意選擇數(shù)據(jù)淘汰绪励。
allkeys-lru:從數(shù)據(jù)集(server. db[i]. dict)中挑選最近最少使用的數(shù)據(jù)淘汰吊说。
allkeys-random:從數(shù)據(jù)集(server. db[i]. dict)中任意選擇數(shù)據(jù)淘汰。
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)优炬。
193. Redis 常見(jiàn)的性能問(wèn)題有哪些?該如何解決厅贪?
主服務(wù)器寫(xiě)內(nèi)存快照蠢护,會(huì)阻塞主線(xiàn)程的工作,當(dāng)快照比較大時(shí)對(duì)性能影響是非常大的养涮,會(huì)間斷性暫停服務(wù)葵硕,所以主服務(wù)器最好不要寫(xiě)內(nèi)存快照。
Redis 主從復(fù)制的性能問(wèn)題贯吓,為了主從復(fù)制的速度和連接的穩(wěn)定性懈凹,主從庫(kù)最好在同一個(gè)局域網(wǎng)內(nèi)。
十九悄谐、JVM
194.說(shuō)一下 jvm 的主要組成部分介评?及其作用?
類(lèi)加載器(ClassLoader)
運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)
執(zhí)行引擎(Execution Engine)
本地庫(kù)接口(Native Interface)
組件的作用: 首先通過(guò)類(lèi)加載器(ClassLoader)會(huì)把 Java 代碼轉(zhuǎn)換成字節(jié)碼爬舰,運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)再把字節(jié)碼加載到內(nèi)存中们陆,而字節(jié)碼文件只是 JVM 的一套指令集規(guī)范,并不能直接交個(gè)底層操作系統(tǒng)去執(zhí)行情屹,因此需要特定的命令解析器執(zhí)行引擎(Execution Engine)坪仇,將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由 CPU 去執(zhí)行垃你,而這個(gè)過(guò)程中需要調(diào)用其他語(yǔ)言的本地庫(kù)接口(Native Interface)來(lái)實(shí)現(xiàn)整個(gè)程序的功能
195.說(shuō)一下 jvm 運(yùn)行時(shí)數(shù)據(jù)區(qū)椅文?
不同虛擬機(jī)的運(yùn)行時(shí)數(shù)據(jù)區(qū)可能略微有所不同,但都會(huì)遵從 Java 虛擬機(jī)規(guī)范惜颇, Java 虛擬機(jī)規(guī)范規(guī)定的區(qū)域分為以下 5 個(gè)部分:
程序計(jì)數(shù)器(Program Counter Register):當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器皆刺,字節(jié)碼解析器的工作是通過(guò)改變這個(gè)計(jì)數(shù)器的值,來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令官还,分支芹橡、循環(huán)、跳轉(zhuǎn)望伦、異常處理林说、線(xiàn)程恢復(fù)等基礎(chǔ)功能煎殷,都需要依賴(lài)這個(gè)計(jì)數(shù)器來(lái)完成
Java 虛擬機(jī)棧(Java Virtual Machine Stacks):用于存儲(chǔ)局部變量表、操作數(shù)棧腿箩、動(dòng)態(tài)鏈接豪直、方法出口等信息
本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過(guò)虛擬機(jī)棧是服務(wù) Java 方法的珠移,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的
Java 堆(Java Heap):Java 虛擬機(jī)中內(nèi)存最大的一塊弓乙,是被所有線(xiàn)程共享的,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存
方法區(qū)(Methed Area):用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息钧惧、常量暇韧、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)
196.說(shuō)一下堆棧的區(qū)別浓瞪?
功能方面:堆是用來(lái)存放對(duì)象的懈玻,棧是用來(lái)執(zhí)行程序的
共享性:堆是線(xiàn)程共享的,棧是線(xiàn)程私有的
空間大星洹:堆大小遠(yuǎn)遠(yuǎn)大于棧
197.隊(duì)列和棧是什么涂乌?有什么區(qū)別?
?隊(duì)列和棧都是被用來(lái)預(yù)存儲(chǔ)數(shù)據(jù)的英岭。
隊(duì)列允許先進(jìn)先出檢索元素湾盒,但也有例外的情況,Deque 接口允許從兩端檢索元素诅妹。
?棧和隊(duì)列很相似罚勾,但它運(yùn)行對(duì)元素進(jìn)行后進(jìn)先出進(jìn)行檢索
198.什么是雙親委派模型?
在介紹雙親委派模型之前先說(shuō)下類(lèi)加載器吭狡。對(duì)于任意一個(gè)類(lèi)荧库,都需要由加載它的類(lèi)加載器和這個(gè)類(lèi)本身一同確立在 JVM 中的唯一性,每一個(gè)類(lèi)加載器赵刑,都有一個(gè)獨(dú)立的類(lèi)名稱(chēng)空間分衫。類(lèi)加載器就是根據(jù)指定全限定名稱(chēng)將 class 文件加載到 JVM 內(nèi)存,然后再轉(zhuǎn)化為 class 對(duì)象般此。
類(lèi)加載器分類(lèi): 啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader)蚪战,是虛擬機(jī)自身的一部分,用來(lái)加載Java_HOME/lib/目錄中的铐懊,或者被 -Xbootclasspath 參數(shù)所指定的路徑中并且被虛擬機(jī)識(shí)別的類(lèi)庫(kù)
其他類(lèi)加載器:
擴(kuò)展類(lèi)加載器(Extension ClassLoader):負(fù)責(zé)加載\lib\ext目錄或Java. ext. dirs系統(tǒng)變量指定的路徑中的所有類(lèi)庫(kù)
應(yīng)用程序類(lèi)加載器(Application ClassLoader)邀桑。負(fù)責(zé)加載用戶(hù)類(lèi)路徑(classpath)上的指定類(lèi)庫(kù),我們可以直接使用這個(gè)類(lèi)加載器科乎。一般情況壁畸,如果我們沒(méi)有自定義類(lèi)加載器默認(rèn)就是用這個(gè)加載器
雙親委派模型:如果一個(gè)類(lèi)加載器收到了類(lèi)加載的請(qǐng)求,它首先不會(huì)自己去加載這個(gè)類(lèi),而是把這個(gè)請(qǐng)求委派給父類(lèi)加載器去完成捏萍,每一層的類(lèi)加載器都是如此太抓,這樣所有的加載請(qǐng)求都會(huì)被傳送到頂層的啟動(dòng)類(lèi)加載器中,只有當(dāng)父加載無(wú)法完成加載請(qǐng)求(它的搜索范圍中沒(méi)找到所需的類(lèi))時(shí)令杈,子加載器才會(huì)嘗試去加載類(lèi)
199.說(shuō)一下類(lèi)加載的執(zhí)行過(guò)程走敌?
?類(lèi)裝載分為以下 5 個(gè)步驟:
加載:根據(jù)查找路徑找到相應(yīng)的 class 文件然后導(dǎo)入
檢查:檢查加載的 class 文件的正確性
準(zhǔn)備:給類(lèi)中的靜態(tài)變量分配內(nèi)存空間
解析:虛擬機(jī)將常量池中的符號(hào)引用替換成直接引用的過(guò)程。符號(hào)引用就理解為一個(gè)標(biāo)示逗噩,而在直接引用直接指向內(nèi)存中的地址
初始化:對(duì)靜態(tài)變量和靜態(tài)代碼塊執(zhí)行初始化工作
200.怎么判斷對(duì)象是否可以被回收掉丽?
一般有兩種方法來(lái)判斷:
?引用計(jì)數(shù)器:為每個(gè)對(duì)象創(chuàng)建一個(gè)引用計(jì)數(shù),有對(duì)象引用時(shí)計(jì)數(shù)器 +1异雁,引用被釋放時(shí)計(jì)數(shù) -1捶障,當(dāng)計(jì)數(shù)器為 0 時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問(wèn)題
可達(dá)性分析:從 GC Roots 開(kāi)始向下搜索纲刀,搜索所走過(guò)的路徑稱(chēng)為引用鏈残邀。當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連時(shí),則證明此對(duì)象是可以被回收的
201.java 中都有哪些引用類(lèi)型柑蛇?
強(qiáng)引用:發(fā)生 gc 的時(shí)候不會(huì)被回收
軟引用:有用但不是必須的對(duì)象,在發(fā)生內(nèi)存溢出之前會(huì)被回收
弱引用:有用但不是必須的對(duì)象驱闷,在下一次GC時(shí)會(huì)被回收
虛引用(幽靈引用/幻影引用):無(wú)法通過(guò)虛引用獲得對(duì)象耻台,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc 時(shí)返回一個(gè)通知
202.說(shuō)一下 jvm 有哪些垃圾回收算法空另?
標(biāo)記-清除算法:標(biāo)記無(wú)用對(duì)象盆耽,然后進(jìn)行清除回收。缺點(diǎn):效率不高扼菠,無(wú)法清除垃圾碎片
標(biāo)記-整理算法:標(biāo)記無(wú)用對(duì)象摄杂,讓所有存活的對(duì)象都向一端移動(dòng),然后直接清除掉端邊界以外的內(nèi)存
復(fù)制算法:按照容量劃分二個(gè)大小相等的內(nèi)存區(qū)域循榆,當(dāng)一塊用完的時(shí)候?qū)⒒钪膶?duì)象復(fù)制到另一塊上析恢,然后再把已使用的內(nèi)存空間一次清理掉。缺點(diǎn):內(nèi)存使用率不高秧饮,只有原來(lái)的一半
分代算法:根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊映挂,一般是新生代和老年代,新生代基本采用復(fù)制算法盗尸,老年代采用標(biāo)記整理算法
203.說(shuō)一下 jvm 有哪些垃圾回收器柑船?
Serial:最早的單線(xiàn)程串行垃圾回收器
Serial Old:Serial 垃圾回收器的老年版本,同樣也是單線(xiàn)程的泼各,可以作為 CMS 垃圾回收器的備選預(yù)案
ParNew:是 Serial 的多線(xiàn)程版本 Parallel 和 ParNew 收集器類(lèi)似是多線(xiàn)程的鞍时,但 Parallel 是吞吐量?jī)?yōu)先的收集器,可以犧牲等待時(shí)間換取系統(tǒng)的吞吐量
Parallel Old 是 Parallel 老生代版本,Parallel 使用的是復(fù)制的內(nèi)存回收算法逆巍,Parallel Old 使用的是標(biāo)記-整理的內(nèi)存回收算法
CMS:一種以獲得最短停頓時(shí)間為目標(biāo)的收集器及塘,非常適用 B/S 系統(tǒng)
G1:一種兼顧吞吐量和停頓時(shí)間的 GC 實(shí)現(xiàn),是 JDK 9 以后的默認(rèn) GC 選項(xiàng)
204.詳細(xì)介紹一下 CMS 垃圾回收器蒸苇?
CMS 是英文 Concurrent Mark-Sweep 的簡(jiǎn)稱(chēng)磷蛹,是以犧牲吞吐量為代價(jià)來(lái)獲得最短回收停頓時(shí)間的垃圾回收器。對(duì)于要求服務(wù)器響應(yīng)速度的應(yīng)用上溪烤,這種垃圾回收器非常適合味咳。在啟動(dòng) JVM 的參數(shù)加上“-XX:+UseConcMarkSweepGC”來(lái)指定使用 CMS 垃圾回收器
CMS 使用的是標(biāo)記-清除的算法實(shí)現(xiàn)的,所以在 gc 的時(shí)候回產(chǎn)生大量的內(nèi)存碎片檬嘀,當(dāng)剩余內(nèi)存不能滿(mǎn)足程序運(yùn)行要求時(shí)槽驶,系統(tǒng)將會(huì)出現(xiàn) Concurrent Mode Failure,臨時(shí) CMS 會(huì)采用 Serial Old 回收器進(jìn)行垃圾清除鸳兽,此時(shí)的性能將會(huì)被降低掂铐。
205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么區(qū)別揍异?
新生代回收器:Serial全陨、ParNew、Parallel Scavenge
老年代回收器:Serial Old衷掷、Parallel Old辱姨、CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是復(fù)制算法,復(fù)制算法的優(yōu)點(diǎn)是效率高戚嗅,缺點(diǎn)是內(nèi)存利用率低雨涛;老年代回收器一般采用的是標(biāo)記-整理的算法進(jìn)行垃圾回收。
206.簡(jiǎn)述分代垃圾回收器是怎么工作的懦胞?
分代回收器有兩個(gè)分區(qū):老生代和新生代替久,新生代默認(rèn)的空間占比總空間的 1/3,老生代的默認(rèn)占比是 2/3
新生代使用的是復(fù)制算法躏尉,新生代里有 3 個(gè)分區(qū):Eden蚯根、To Survivor、From Survivor胀糜,它們的默認(rèn)占比是 8:1:1稼锅,它的執(zhí)行流程如下: 把 Eden + From Survivor 存活的對(duì)象放入 To Survivor 區(qū)
清空 Eden 和 From Survivor 分區(qū)
From Survivor 和 To Survivor 分區(qū)交換,F(xiàn)rom Survivor 變 To Survivor僚纷,To Survivor 變 From Survivor 每次在 From Survivor 到 To Survivor
移動(dòng)時(shí)都存活的對(duì)象矩距,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)配置是 15)時(shí)怖竭,升級(jí)為老生代锥债。大對(duì)象也會(huì)直接進(jìn)入老生代。 老生代當(dāng)空間占用到達(dá)某個(gè)值之后就會(huì)觸發(fā)全局垃圾收回,一般使用標(biāo)記整理的執(zhí)行算法哮肚。以上這些循環(huán)往復(fù)就構(gòu)成了整個(gè)分代垃圾回收的整體執(zhí)行流程登夫。
207.說(shuō)一下 jvm 調(diào)優(yōu)的工具?
JDK 自帶了很多監(jiān)控工具允趟,都位于 JDK 的 bin 目錄下恼策,其中最常用的是 jconsole 和 jvisualvm 這兩款視圖監(jiān)控工具
?jconsole:用于對(duì) JVM 中的內(nèi)存、線(xiàn)程和類(lèi)等進(jìn)行監(jiān)控潮剪;
jvisualvm:JDK 自帶的全能分析工具涣楷,可以分析:內(nèi)存快照、線(xiàn)程快照抗碰、程序死鎖狮斗、監(jiān)控內(nèi)存的變化、gc 變化等
208.常用的 jvm 調(diào)優(yōu)的參數(shù)都有哪些弧蝇?
-Xms2g:初始化推大小為 2g
-Xmx2g:堆最大內(nèi)存為 2g
-XX:NewRatio=4:設(shè)置年輕的和老年代的內(nèi)存比例為 1:4
-XX:SurvivorRatio=8:設(shè)置新生代 Eden 和 Survivor 比例為 8:2
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合
-XX:+PrintGC:開(kāi)啟打印 gc 信息
-XX:+PrintGCDetails:打印 gc 詳細(xì)信息