young gc頻繁赤惊,老年代占用線性上漲
young gc頻繁因?yàn)楫a(chǎn)生系統(tǒng)使用log4j1版本在系統(tǒng)中大量使用debug日志輸入,導(dǎo)致頻繁創(chuàng)建Stringbuilder對(duì)象梨与,然后導(dǎo)致年輕代空間不夠堕花,執(zhí)行頻繁gc
分析老年代內(nèi)存泄漏是因?yàn)橐粋€(gè)對(duì)象
這玩意是個(gè)啥呢,是個(gè)數(shù)據(jù)庫連接相關(guān)的虛引用粥鞋,每個(gè)數(shù)據(jù)連接對(duì)應(yīng)生產(chǎn)這么一個(gè)虛引用對(duì)象缘挽,這個(gè)對(duì)象負(fù)責(zé)在連接對(duì)象被回收后通知系統(tǒng)。
在<<深入理解Java虛擬機(jī)>>3.2.3中有這么一句話
“為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知呻粹『韭”
為啥跑到老年代呢,
一等浊,因?yàn)槟贻p代gc太頻繁了腮郊,數(shù)據(jù)庫連接對(duì)象在短時(shí)間內(nèi)超過15次存活年齡檢查。
二筹燕,因?yàn)閿?shù)據(jù)庫連接兩個(gè)參數(shù)
minEvictableIdleTimeMillis=300000 如果連接空閑超過這個(gè)時(shí)間轧飞,就可以被回收。
timeBetweenEvictionRunsMillis=120000 每次檢查空閑的時(shí)間間隔
就是說數(shù)據(jù)庫連接對(duì)象強(qiáng)行被擠到年老代 然后隨后可能連接已經(jīng)釋放撒踪,但是虛引用一直沒有被回收过咬,導(dǎo)致老年代越級(jí)越大。
怎么解決
把log4j升級(jí)到2版本糠涛,然后把日志盡量精細(xì)化管理援奢,不要打印無謂的低級(jí)別的日志兼犯。