gitlab啟動(dòng) / 關(guān)閉 / 重啟命令:gitlab-ctl start / stop / restart
多線程問(wèn)題
* 多個(gè)線程調(diào)用同一個(gè)類的同一靜態(tài)方法,或者調(diào)用同一對(duì)象的同一方法,在方法中沒(méi)有引用外部變量時(shí),不會(huì)有多線程問(wèn)題。


java進(jìn)程cpu占用過(guò)高問(wèn)題排查
1. top(顯示進(jìn)程所有進(jìn)程,找出占用cpu高的java進(jìn)程)
2. ps -mp pid -o THREAD,tid,time (找出進(jìn)程下占用cpu高的線程)
3. printf "%x\n" tid (將線程id轉(zhuǎn)成16進(jìn)制)
4. jstack pid |grep tid -A 30 (打印線程的堆棧信息)
查看java進(jìn)程啟動(dòng)參數(shù)命令
1. jcmd pid VM.flags
2. jinfo -flags pid
jvm常用啟動(dòng)參數(shù)
java -jar?-Xms2g -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=512k example-0.0.1-SNAPSHOT.jar
線上服務(wù)器問(wèn)題排查
https://fredal.xin/java-error-check?
java進(jìn)程沒(méi)了,可能因?yàn)橄到y(tǒng)內(nèi)存不夠被linux殺掉。cat /var/log/message |grep 'Out of memory'
線程池執(zhí)行任務(wù)邏輯和線程池參數(shù)關(guān)系
corePoolSize:核心線程數(shù)量
maximumPoolSize:線程池最大數(shù)量
keepAliveTime:空間線程存活時(shí)間
workQueue:線程池緩沖隊(duì)列
threadFactory:線程池創(chuàng)建線程使用的工廠
handler:線程池對(duì)拒絕任務(wù)的處理策略

單個(gè)controller請(qǐng)求數(shù)及響應(yīng)時(shí)間參考(controller邏輯很簡(jiǎn)單,直接返回字符串):
請(qǐng)求數(shù)????????請(qǐng)求耗時(shí)? ? ? ?平均單次請(qǐng)求耗時(shí)(s)
10000? ? ? ? ? ? 2.91? ? ? ? ? ? ? ? ?0.000291
100000? ? ? ? ? 17.9? ? ? ? ? ? ? ? ?0.000179
1000000? ? ? ? 175.72? ? ? ? ? ? ?0.000175
java鎖
鎖的存儲(chǔ):存儲(chǔ)在對(duì)象頭信息里
鎖的類型:
偏向鎖:不存在鎖競(jìng)爭(zhēng)時(shí)采用,默認(rèn)關(guān)閉。
輕量級(jí)鎖:不存在鎖競(jìng)爭(zhēng)時(shí)采用的鎖。
重量級(jí)鎖:存在鎖競(jìng)爭(zhēng)采用。
解決hash沖突方法
hash沖突:多個(gè)不同的key通過(guò)hash函數(shù)運(yùn)算之后落到同一個(gè)數(shù)組下標(biāo)
假設(shè)下標(biāo)為i
1. 線性探索(開(kāi)放尋址法)。若下標(biāo)i有數(shù)據(jù),則判斷i+1是否有數(shù)據(jù),無(wú)數(shù)據(jù)將數(shù)據(jù)存入i+1,否則判斷i+2 .... eg: ThreadLocal
2. 鏈?zhǔn)降刂贩?。下?biāo)沖突的地方采用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。eg: HashMap
3. 再hash(通過(guò)多個(gè)hash函數(shù)運(yùn)算)eg: 布隆過(guò)濾器(底層采用bitMap實(shí)現(xiàn))
4. 建立公共溢出區(qū)(把hash表分為基本表和溢出表,發(fā)生沖突的數(shù)據(jù)存入溢出表中)