前言
Java程序員,剛?cè)胄械臅r候一般都抱著一本《Java核心技術(shù)》爆啃,對知識有苛求的,會選擇把卷二讀一遍。兩本4、5百頁的書,看完之后,自我覺得知識已經(jīng)滿了。從此開始投身在不停的寫service,dao,controller的階段。
過了兩年,等換工作的時候,除了能把公司業(yè)務(wù)聊的一清二楚,發(fā)現(xiàn)真沒有什么亮點,虛擬機,多線程多半都是面試前,突擊的惡補一遍,勉勉強強能夠應(yīng)付各類面試提問。
但是,如果你不甘心只做一名碼農(nóng),整日無休止的粘貼復(fù)制。建議你看完這篇文章。
起因
在一次測試過程中,發(fā)現(xiàn)mysql報MySQL: ERROR 1040: Too many connections。很明顯,連接數(shù)已達到最大值,手動增加了mysql的連接數(shù),并重啟完成服務(wù)重啟。
但修改連接池數(shù)量,并不能從根本上解決問題。從mysql的連接列表里,發(fā)現(xiàn)隔一段時間會有新的應(yīng)用連接進來,并很快就進入休眠狀態(tài),活躍的連接很少。但是因為連接的斷開過程是很慢的,所以當(dāng)大量新建連接占滿連接數(shù)的時候,mysql就拒絕了其它新的連接請求。
過程
經(jīng)過分析,發(fā)現(xiàn)一個同學(xué)在寫的springboot應(yīng)用里,并沒有設(shè)置應(yīng)用端連接池,開始進行連接池的添加,springboot默認內(nèi)置了hikariCP,當(dāng)然,你可以選擇druid,c3p0。
添加完連接池,問題就已經(jīng)解決掉了。于是開始對比,為什么springboot把hikariCP作為默認連接池。開始比對hikariCP和其它連接池的對比。
數(shù)據(jù)庫連接池性能比對(hikari druid c3p0 dbcp jdbc)
發(fā)現(xiàn)此作者,不但有連接池,還有一個json包,hikariJSON,比jackson快數(shù)倍。源碼數(shù)量很小,于是,直接把源碼拉下來看了下。
https://github.com/brettwooldridge/HikariJSON
代碼寫的很規(guī)整,包含測試用例,跟著測試用例的示例一步步看下去,發(fā)現(xiàn)FieldBasedJsonMapper類中引用到了Unsafe,提供了java以類c指針的方式分配內(nèi)存,增加了java對堆外內(nèi)存的控制。于是,把unsafe看了一遍。
Java魔法類:Unsafe應(yīng)用解析
既然是堆外內(nèi)存操作,很自然的要對比堆內(nèi)的區(qū)別。再細分,就是堆內(nèi)內(nèi)存分配,類加載,動態(tài)字節(jié)碼,熱修復(fù),垃圾回收等等。
方法
Java程序員隊伍的初中高,取決于對該語言的理解,熟悉基礎(chǔ)語法,運行環(huán)境;懂一些基本開發(fā)模式,會一些常用框架;熟悉框架設(shè)計,懂得各模塊實現(xiàn)原理;熟悉虛擬機,熟悉解釋層與物理層之間的交互;理解編譯層和執(zhí)行層作用在不同硬件上的差異(比如什么狀態(tài)下cpu使用高,哪些內(nèi)存用的多,又比如哪些會造成內(nèi)存泄露,逃逸,溢出);最后就是,你已經(jīng)不滿足JVM提供的各類便利性,你認為它的各種優(yōu)化過于復(fù)雜,執(zhí)行周期漫長。你要自己來搞。
大部分人,停留在初、中。寫了一輩子代碼,做了很多業(yè)務(wù)方向,但都未曾嘗試過優(yōu)化改變JVM底層設(shè)計。很顯然,在多數(shù)場景下,無需做額外工作,足夠讓業(yè)務(wù)跑起來。但是,一旦出了問題,就完全束手無策。
Java相關(guān)衍生太多,類別分類也太多,窮盡一生,也無法面面俱到。除了對主要模塊的深入理解,更多的是從一個小事情,不斷延伸發(fā)散,順著一條主線深挖,一定會碰到意想不到的興奮點。而這些,就是成長體現(xiàn)。
隨著問題線的數(shù)量越來越多,逐漸會對整個體系有一個全面理解,這時候,才能真正進階到高級階段。
后記
從高級上升到架構(gòu),不但要有過硬的技術(shù)能力,還需要對業(yè)務(wù)場景、解決方案有更為通透的理解。
貼近業(yè)務(wù),提升通過技術(shù)手段解決各類問題的能力。推動技術(shù)變革的,永遠是不斷變化的業(yè)務(wù)發(fā)展。
希望這一次常規(guī)的小記,對剛?cè)胄械耐瑢W(xué)們有些幫助。