CopyOnWrite的缺點(diǎn)
CopyOnWrite容器有很多優(yōu)點(diǎn)阁谆,但是同時(shí)也存在兩個(gè)問題,即內(nèi)存占用問題和數(shù)據(jù)一致性問題愉老。所以在開發(fā)的時(shí)候需要注意一下场绿。
- 內(nèi)存占用問題。
因?yàn)镃opyOnWrite的寫時(shí)復(fù)制機(jī)制嫉入,所以在進(jìn)行寫操作的時(shí)候裳凸,內(nèi)存里會(huì)同時(shí)駐扎兩個(gè)對象的內(nèi)存贱鄙,舊的對象和新寫入的對象(注意:在復(fù)制的時(shí)候只是復(fù)制容器里的引用,只是在寫的時(shí)候會(huì)創(chuàng)建新對象添加到新容器里姨谷,而舊容器的對象還在使用逗宁,所以有兩份對象內(nèi)存)。如果這些對象占用的內(nèi)存比較大梦湘,比如說200M左右瞎颗,那么再寫入100M數(shù)據(jù)進(jìn)去,內(nèi)存就會(huì)占用300M捌议,那么這個(gè)時(shí)候很有可能造成頻繁的Yong GC和Full GC哼拔。之前我們系統(tǒng)中使用了一個(gè)服務(wù)由于每晚使用CopyOnWrite機(jī)制更新大對象,造成了每晚15秒的Full GC瓣颅,應(yīng)用響應(yīng)時(shí)間也隨之變長倦逐。
針對內(nèi)存占用問題,可以通過壓縮容器中的元素的方法來減少大對象的內(nèi)存消耗宫补,比如檬姥,如果元素全是10進(jìn)制的數(shù)字,可以考慮把它壓縮成36進(jìn)制或64進(jìn)制粉怕〗∶瘢或者不使用CopyOnWrite容器,而使用其他的并發(fā)容器贫贝,如ConcurrentHashMap
- 數(shù)據(jù)一致性問題秉犹。
CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實(shí)時(shí)一致性稚晚。所以如果你希望寫入的的數(shù)據(jù)崇堵,馬上能讀到,請不要使用CopyOnWrite容器客燕。