精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面向 GC 的 Java 編程

開發 后端
Java程序員在編碼過程中通常不需要考慮內存問題,JVM經過高度優化的GC機制大部分情況下都能夠很好地處理堆(Heap)的清理問題。以至于許多Java程序員認為,我只需要關心何時創建對象,而回收對象,就交給GC來做吧!

Java程序員在編碼過程中通常不需要考慮內存問題,JVM經過高度優化的GC機制大部分情況下都能夠很好地處理堆(Heap)的清理問題。以至于許多Java程序員認為,我只需要關心何時創建對象,而回收對象,就交給GC來做吧!甚至有人說,如果在編程過程中頻繁考慮內存問題,是一種退化,這些事情應該交給編譯器,交給虛擬機來解決。

這話其實也沒有太大問題,的確,大部分場景下關心內存、GC的問題,顯得有點“杞人憂天”了,高老爺說過:

過早優化是萬惡之源。

但另一方面,什么才是“過早優化”?

If we could do things right for the first time, why not?

事實上JVM的內存模型( JMM )理應是Java程序員的基礎知識,處理過幾次JVM線上內存問題之后就會很明顯感受到,很多系統問題,都是內存問題。

對JVM內存結構感興趣的同學可以看下 淺析Java虛擬機結構與機制 這篇文章,本文就不再贅述了,本文也并不關注具體的GC算法,相關的文章汗牛充棟,隨時可查。

另外,不要指望GC優化的這些技巧,可以對應用性能有成倍的提高,特別是對I/O密集型的應用,或是實際落在YoungGC上的優化,可能效果只是幫你減少那么一點YoungGC的頻率。

但我認為,優秀程序員的價值,不在于其所掌握的幾招屠龍之術,而是在細節中見真著,就像前面說的,如果我們可以一次把事情做對,并且做好,在允許的范圍內盡可能追求卓越,為什么不去做呢?

一、GC分代的基本假設

大部分GC算法,都將堆內存做分代(Generation)處理,但是為什么要分代呢,又為什么不叫內存分區、分段,而要用面向時間、年齡的“代”來表示不同的內存區域?

GC分代的基本假設是:

絕大部分對象的生命周期都非常短暫,存活時間短。

而這些短命的對象,恰恰是GC算法需要首先關注的。所以在大部分的GC中,YoungGC(也稱作MinorGC)占了絕大部分,對于負載不高的應用,可能跑了數個月都不會發生FullGC。

基于這個前提,在編碼過程中,我們應該盡可能地縮短對象的生命周期。在過去,分配對象是一個比較重的操作,所以有些程序員會盡可能地減少new對象的次數,嘗試減小堆的分配開銷,減少內存碎片。

但是,短命對象的創建在JVM中比我們想象的性能更好,所以,不要吝嗇new關鍵字,大膽地去new吧。

當然前提是不做無謂的創建,對象創建的速率越高,那么GC也會越快被觸發。

結論:

分配小對象的開銷分享小,不要吝嗇去創建。

GC最喜歡這種小而短命的對象。

讓對象的生命周期盡可能短,例如在方法體內創建,使其能盡快地在YoungGC中被回收,不會晉升(romote)到年老代(Old Generation)。

二、對象分配的優化

基于大部分對象都是小而短命,并且不存在多線程的數據競爭。這些小對象的分配,會優先在線程私有的 TLAB 中分配,TLAB中創建的對象,不存在鎖甚至是CAS的開銷。

TLAB占用的空間在Eden Generation。

當對象比較大,TLAB的空間不足以放下,而JVM又認為當前線程占用的TLAB剩余空間還足夠時,就會直接在Eden Generation上分配,此時是存在并發競爭的,所以會有CAS的開銷,但也還好。

當對象大到Eden Generation放不下時,JVM只能嘗試去Old Generation分配,這種情況需要盡可能避免,因為一旦在Old Generation分配,這個對象就只能被Old Generation的GC或是FullGC回收了。

三、不可變對象的好處

GC算法在掃描存活對象時通常需要從ROOT節點開始,掃描所有存活對象的引用,構建出對象圖。

不可變對象對GC的優化,主要體現在Old Generation中。

可以想象一下,如果存在Old Generation的對象引用了Young Generation的對象,那么在每次YoungGC的過程中,就必須考慮到這種情況。

Hotspot JVM為了提高YoungGC的性能,避免每次YoungGC都掃描Old Generation中的對象引用,采用了 卡表(Card Table) 的方式。

簡單來說,當Old Generation中的對象發生對Young Generation中的對象產生新的引用關系或釋放引用時,都會在卡表中響應的標記上標記為臟(dirty),而YoungGC時,只需要掃描這些dirty的項就可以了。

可變對象對其它對象的引用關系可能會頻繁變化,并且有可能在運行過程中持有越來越多的引用,特別是容器。這些都會導致對應的卡表項被頻繁標記為dirty。

而不可變對象的引用關系非常穩定,在掃描卡表時就不會掃到它們對應的項了。

注意,這里的不可變對象,不是指僅僅自身引用不可變的final對象,而是真正的Immutable Objects。

四、引用置為null的傳說

早期的很多Java資料中都會提到在方法體中將一個變量置為null能夠優化GC的性能,類似下面的代碼:

  1. List<String> list = new ArrayList<String>();  
  2. // some code  
  3. list = null// help GC 

事實上這種做法對GC的幫助微乎其微,有時候反而會導致代碼混亂。

我記得幾年前 @rednaxelafx 在HLL VM小組中詳細論述過這個問題,原帖我沒找到,結論基本就是:

在一個非常大的方法體內,對一個較大的對象,將其引用置為null,某種程度上可以幫助GC。

大部分情況下,這種行為都沒有任何好處。

所以,還是早點放棄這種“優化”方式吧。

GC比我們想象的更聰明。

五、手動檔的GC

在很多Java資料上都有下面兩個奇技淫巧:

通過Thread.yield()讓出CPU資源給其它線程。

通過System.gc()觸發GC。

事實上JVM從不保證這兩件事,而System.gc()在JVM啟動參數中如果允許顯式GC,則會觸發FullGC,對于響應敏感的應用來說,幾乎等同于自殺。

So,讓我們牢記兩點:

 

Never use Thread.yield()。

Never use System.gc()。除非你真的需要回收Native Memory。

第二點有個Native Memory的例外,如果你在以下場景:

· 使用了NIO或者NIO框架(Mina/Netty)

· 使用了DirectByteBuffer分配字節緩沖區

· 使用了MappedByteBuffer做內存映射

由于Native Memory只能通過FullGC(或是CMS GC)回收,所以除非你非常清楚這時真的有必要,否則不要輕易調用System.gc(),且行且珍惜。

另外為了防止某些框架中的System.gc調用(例如NIO框架、Java RMI),建議在啟動參數中加上-XX:+DisableExplicitGC來禁用顯式GC。

這個參數有個巨大的坑,如果你禁用了System.gc(),那么上面的3種場景下的內存就無法回收,可能造成OOM,如果你使用了CMS GC,那么可以用這個參數替代:-XX:+ExplicitGCInvokesConcurrent。

關于System.gc(),可以參考 @bluedavy 的幾篇文章:

· CMS GC會不會回收Direct ByteBuffer的內存

· 說說在Java啟動參數上我犯的錯

· java.lang.OutOfMemoryError:Map failed

六、指定容器初始化大小

Java容器的一個特點就是可以動態擴展,所以通常我們都不會去考慮初始大小的設置,不夠了反正會自動擴容唄。

但是擴容不意味著沒有代價,甚至是很高的代價。

例如一些基于數組的數據結構,例如StringBuilder、StringBuffer、ArrayList、HashMap等等,在擴容的時候都需要做ArrayCopy,對于不斷增長的結構來說,經過若干次擴容,會存在大量無用的老數組,而回收這些數組的壓力,全都會加在GC身上。

這些容器的構造函數中通常都有一個可以指定大小的參數,如果對于某些大小可以預估的容器,建議加上這個參數。

可是因為容器的擴容并不是等到容器滿了才擴容,而是有一定的比例,例如HashMap的擴容閾值和負載因子(loadFactor)相關。

Google Guava框架對于容器的初始容量提供了非常便捷的工具方法,例如:

  1. Lists.newArrayListWithCapacity(initialArraySize);  
  2.  
  3. Lists.newArrayListWithExpectedSize(estimatedSize);  
  4.  
  5. Sets.newHashSetWithExpectedSize(expectedSize);  
  6.  
  7. Maps.newHashMapWithExpectedSize(expectedSize); 

這樣我們只要傳入預估的大小即可,容量的計算就交給Guava來做吧。

反例:

如果采用默認無參構造函數,創建一個ArrayList,不斷增加元素直到OOM,那么在此過程中會導致:

多次數組擴容,重新分配更大空間的數組

多次數組拷貝

內存碎片

七、對象池

為了減少對象分配開銷,提高性能,可能有人會采取對象池的方式來緩存對象集合,作為復用的手段。

但是對象池中的對象由于在運行期長期存活,大部分會晉升到Old Generation,因此無法通過YoungGC回收。

并且通常……沒有什么效果。

對于對象本身:

如果對象很小,那么分配的開銷本來就小,對象池只會增加代碼復雜度。

如果對象比較大,那么晉升到Old Generation后,對GC的壓力就更大了。

從線程安全的角度考慮,通常池都是會被并發訪問的,那么你就需要處理好同步的問題,這又是一個大坑,并且同步帶來的開銷,未必比你重新創建一個對象小。

對于對象池,唯一合適的場景就是當池中的每個對象的創建開銷很大時,緩存復用才有意義,例如每次new都會創建一個連接,或是依賴一次RPC。

比如說:

· 線程池

· 數據庫連接池

· TCP連接池

即使你真的需要實現一個對象池,也請使用成熟的開源框架,例如Apache Commons Pool。

另外,使用JDK的ThreadPoolExecutor作為線程池,不要重復造輪子,除非當你看過AQS的源碼后認為你可以寫得比Doug Lea更好。

八、對象作用域

盡可能縮小對象的作用域,即生命周期。

如果可以在方法內聲明的局部變量,就不要聲明為實例變量。

除非你的對象是單例的或不變的,否則盡可能少地聲明static變量。

九、各類引用

java.lang.ref.Reference有幾個子類,用于處理和GC相關的引用。JVM的引用類型簡單來說有幾種:

· Strong Reference,最常見的引用

· Weak Reference,當沒有指向它的強引用時會被GC回收

· Soft Reference,只當臨近OOM時才會被GC回收

· Phantom Reference,主要用于識別對象被GC的時機,通常用于做一些清理工作

當你需要實現一個緩存時,可以考慮優先使用WeakHashMap,而不是HashMap,當然,更好的選擇是使用框架,例如Guava Cache。

***,再次提醒,以上的這些未必可以對代碼有多少性能上的提升,但是熟悉這些方法,是為了幫助我們寫出更卓越的代碼,和GC更好地合作。

原文鏈接:http://blog.hesey.net/2014/05/gc-oriented-java-programming.html

 

責任編輯:林師授 來源: 舒の隨想日記
相關推薦

2013-07-30 09:42:41

實現編程接口編程對象編程

2011-07-05 14:42:46

java

2024-04-24 12:03:20

2022-07-30 23:41:53

面向過程面向對象面向協議編程

2009-06-16 17:09:17

Scala面向對象函數編程

2011-07-21 17:19:47

java面向對象

2021-01-14 08:16:41

Python接口編程

2010-11-17 11:31:22

Scala基礎面向對象Scala

2023-11-07 16:00:25

面向切面編程開發

2012-02-10 10:32:33

JavaSpring

2017-04-21 09:07:39

JavaScript對象編程

2012-01-17 09:34:52

JavaScript

2009-06-22 13:48:00

Java編程思想面向對象

2012-12-13 11:01:42

IBMdW

2009-08-24 09:46:40

面向切面編程AOP

2016-12-12 15:22:41

編程

2012-02-27 09:30:22

JavaScript

2023-11-30 08:00:54

面向對象面向切面

2023-10-20 09:32:25

Java技術

2021-05-28 05:34:06

Golang語言編程
點贊
收藏

51CTO技術棧公眾號

深夜福利视频网站| 超碰在线国产97| 芒果视频成人app| 日本一区二区三区在线观看| 成人性生交大片免费看视频直播 | 日本欧美中文字幕| 免费高清在线观看电视| 伦理一区二区三区| 欧美日韩和欧美的一区二区| 国产美女主播在线| 最新电影电视剧在线观看免费观看| 精品一区二区三区日韩| 91chinesevideo永久地址| 91狠狠综合久久久久久| 另类图片第一页| 欧美电影一区二区三区| 日韩av黄色网址| 亚洲精品天堂| 国产精品污www在线观看| 国产精品久久亚洲7777| 日韩人妻精品中文字幕| 欧美午夜一区| 久久激情视频久久| 一色道久久88加勒比一| 成人福利一区| 欧美一区二区在线免费观看| 国内自拍视频一区| 国产亚洲成av人片在线观看 | 亚洲成人精品综合在线| 欧美色视频日本版| 国产精品69久久久| yellow91字幕网在线| 国产欧美视频在线观看| 久久久久久久免费| 殴美一级特黄aaaaaa| 日韩av不卡在线观看| 4438全国成人免费| 日韩三级一区二区三区| av在线导航| 免费看电影在线| 日韩成人免费看| 97在线视频一区| 亚洲国产综合久久| 999久久久91| 国产午夜一区二区| 91成年人网站| 视频精品在线观看| 亚洲黄页视频免费观看| 中国特级黄色大片| 99久久香蕉| 欧美mv日韩mv亚洲| 久久国产免费视频| 99re91这里只有精品| 日韩一级高清毛片| 亚洲成人激情小说| 9l视频自拍九色9l视频成人| 欧美不卡一区二区| 少妇熟女视频一区二区三区| 大型av综合网站| 精品国一区二区三区| 亚洲精品久久一区二区三区777| 网站一区二区| 欧美xxxx老人做受| 中文字幕乱视频| 奇米影视777在线欧美电影观看| 精品国产乱码久久久久久牛牛| 久草福利在线观看| 91成人在线精品视频| 亚洲精品一区二区三区蜜桃下载| 亚洲美女精品视频| 日本久久成人网| 国产亚洲欧洲在线| 激情五月激情综合| 欧美日韩一区二区国产| 国产91成人在在线播放| 日本久久综合网| 久久激情五月激情| 91成人免费在线观看| 亚洲精品视频网| 26uuu另类欧美| 亚洲午夜在线观看| 欧美性爽视频| 五月激情丁香一区二区三区| 亚洲精品乱码久久久久久自慰| 狂野欧美性猛交xxxx| 欧美一级艳片视频免费观看| 欧美双性人妖o0| 成人aaaa| 欧美大片在线影院| 精品国产一区二区三区四| 日韩不卡一二三区| 成人欧美一区二区三区视频xxx| 午夜福利理论片在线观看| 国产日韩精品视频一区| 日本丰满大乳奶| 女厕盗摄一区二区三区| 色网站国产精品| 无套白嫩进入乌克兰美女| 婷婷激情久久| 欧美成人免费va影院高清| 久久久久久久久久免费视频| 美女视频黄a大片欧美| 国产伦精品一区二区三区视频孕妇 | 亚洲精品国产suv| 激情无码人妻又粗又大| 亚洲精品看片| 成人欧美在线视频| 日韩在线无毛| 亚洲主播在线观看| www.久久久精品| 亚洲自拍电影| 欧美激情欧美激情在线五月| 中文字幕自拍偷拍| 97久久精品人人澡人人爽| 久久久成人精品一区二区三区| 中文字幕人成乱码在线观看| 欧美变态tickling挠脚心| 日本美女bbw| 香蕉精品999视频一区二区| 91超碰rencao97精品| 亚洲乱亚洲乱妇| 91国偷自产一区二区三区观看 | 黄色动漫在线免费看| 激情不卡一区二区三区视频在线| 亚洲欧洲第一视频| 欧美bbbbbbbbbbbb精品| 国产99久久久国产精品| 亚洲图片在线观看| 香蕉久久免费电影| 日韩电影在线观看永久视频免费网站| 91视频综合网| 国产中文字幕一区| 亚洲欧洲一区二区福利| 日韩不卡免费高清视频| 日韩av网站大全| 日韩av免费网址| 成人性色生活片免费看爆迷你毛片| 中文字幕超清在线免费观看| av成人在线看| 中日韩午夜理伦电影免费| 国产伦精品一区二区三区视频我| 91视频在线看| 怡红院av亚洲一区二区三区h| 福利在线一区| 91国内精品久久| 熟妇人妻中文av无码| 五月婷婷久久综合| 国产黑丝一区二区| 99精品视频免费| 国产午夜精品一区| 免费在线小视频| 亚洲精品日韩在线| 久久精品五月天| 日本一区二区综合亚洲| 奇米影视四色在线| 国产精品99一区二区三| 91丨九色丨国产在线| 黄色一级大片在线免费看产| 欧美高清激情brazzers| 日韩欧美综合视频| 国产激情视频一区二区在线观看 | 欧美福利一区二区三区| 在线黄色的网站| 一区二区欧美久久| 一级做a爰片久久毛片16| 中文字幕一区二区三区乱码在线 | 欧美多人乱p欧美4p久久| 不卡视频免费在线观看| 亚洲h精品动漫在线观看| 五月婷婷综合在线观看| 日韩精品亚洲一区| 日日噜噜噜夜夜爽爽| 日韩中文字幕无砖| 97视频免费观看| 国产三级视频在线| 3d动漫精品啪啪1区2区免费 | 欧美三级黄网| 91麻豆精品久久久久蜜臀| 久久精品国产av一区二区三区| 91麻豆精品一区二区三区| 天堂一区在线观看| 红桃视频亚洲| 日韩不卡av| 日韩视频在线直播| 欧洲成人免费aa| 美女写真理伦片在线看| 亚洲国产高潮在线观看| 免费黄色一级大片| 一区二区三区免费| 亚洲一区视频在线播放| 国产成人午夜精品5599 | eeuss中文| 精品福利在线| 高清欧美一区二区三区| 成人在线免费观看| 欧美不卡视频一区| 在线免费a视频| 午夜精品在线视频一区| 99热这里只有精品4| 成人激情黄色小说| 一女二男3p波多野结衣| 国产日韩一区| 男人天堂成人网| 欧美三级美国一级| 国产精品视频入口| 婷婷精品久久久久久久久久不卡| 午夜精品久久久久久久99热| 欧美一区二区三区| 亚洲欧美日韩在线一区| 亚洲国产日韩在线观看| 欧美图区在线视频| 五月婷婷亚洲综合| 亚洲最色的网站| 精品亚洲乱码一区二区| 久久久不卡网国产精品二区| 亚洲麻豆一区二区三区| 美国十次了思思久久精品导航| 欧美精品99久久| 欧美日韩国产亚洲一区| 黄色免费高清视频| 欧美色图在线播放| 欧美成人蜜桃| 欧美丝袜足交| 国产精品久久久久久免费观看| 国产日韩欧美中文在线| 国产欧美一区二区白浆黑人| 免费电影日韩网站| 97超级碰在线看视频免费在线看 | 欧美性生交大片免网| 久一视频在线观看| 亚洲精品videosex极品| 日本午夜在线观看| 国产精品家庭影院| 天堂av网手机版| 中文字幕精品一区二区精品绿巨人 | 久久久久久麻豆| 波多野结衣福利| 91亚洲精品久久久蜜桃| 中文字幕乱码在线| 99久久99久久精品国产片果冻| 四虎成人免费视频| 成人亚洲一区二区一| 无码av免费精品一区二区三区| 国产成人鲁色资源国产91色综| 无码人妻丰满熟妇区毛片蜜桃精品 | 98精品视频| 日韩亚洲不卡在线| 欧美影院三区| 亚洲在线色站| 91成人观看| 成人手机在线播放| 亚洲性人人天天夜夜摸| 国产精品久久久久7777| 亚洲激情另类| 日韩 欧美 高清| 免费观看久久久4p| 国产永久免费网站| 国产精品羞羞答答xxdd| 四虎永久免费观看| 99在线精品一区二区三区| 亚洲第一页av| 国产精品另类一区| 国产精品视频一区二区三| 亚洲一区自拍偷拍| 国产情侣在线视频| 色菇凉天天综合网| 中文字幕在线观看你懂的| 欧美精品免费视频| 亚洲精品福利网站| 日韩精品中文字幕有码专区| 成人影视在线播放| 久久天天躁狠狠躁夜夜av| 伦理在线一区| 日本伊人精品一区二区三区介绍 | 国产精品电影| 国产精品高潮粉嫩av| 精品国产三级| 久久精品国产第一区二区三区最新章节| 亚洲素人在线| 中文字幕在线中文字幕日亚韩一区| 欧美日韩免费| 激情婷婷综合网| 黄色资源网久久资源365| 日韩www视频| 国产精品久久久久久久久免费丝袜| 翔田千里88av中文字幕| 亚洲国产精品欧美一二99 | 91精品国产欧美一区二区成人 | 国产精品久久久久久久久久久久久久久 | 国产美女永久无遮挡| 久久黄色网页| 少妇伦子伦精品无吗| 久久午夜老司机| 久久久久亚洲av无码专区体验| 日韩欧亚中文在线| 国产成人精品一区二三区四区五区| 日韩精品视频免费| 亚洲卡一卡二| 91精品国产自产在线| 日本天堂一区| 丁香色欲久久久久久综合网| 日本免费新一区视频| 一区二区三区日韩欧美| 艳妇荡乳欲伦69影片| 欧美性xxxxx| 亚洲黄色a级片| 久久精品国产电影| sis001欧美| 国产欧美一区二区三区另类精品| 日韩综合网站| 日本www高清视频| 99亚偷拍自图区亚洲| 国产精品国产精品88| 欧美亚洲综合一区| 日本大片在线观看| 欧美高清第一页| 精品久久国产一区| 亚洲国产欧美一区二区三区不卡| 中文高清一区| www.四虎精品| 亚洲免费视频成人| 亚洲天堂中文网| 国产一区二区三区网站| 天堂а√在线最新版中文在线| 97影院在线午夜| 亚洲国产成人精品女人| www.这里只有精品| 久久久国产精品不卡| 天天操夜夜操视频| 亚洲国产小视频| 91av久久| 国产一区精品视频| 激情亚洲网站| 中国黄色片视频| 亚洲国产精品久久人人爱| www.四虎在线观看| 九九久久综合网站| 亚洲精品观看| 少妇大叫太大太粗太爽了a片小说| 国产综合久久久久久久久久久久| 一区二区三区在线播放视频| 欧美日韩精品一区视频| av电影在线观看| 91精品久久久久久| 小处雏高清一区二区三区| 在线一区二区不卡| 中文字幕一区在线观看视频| 97国产精品久久久| 久久九九热免费视频| 日本精品在线播放| www.国产二区| 成人午夜免费电影| 亚洲第一精品在线观看| 国产视频在线观看一区二区| 午夜精品久久久久久久久久蜜桃| 日本一区二区三不卡| 蜜桃传媒麻豆第一区在线观看| 日本不卡一区视频| 制服丝袜一区二区三区| 视频在线观看入口黄最新永久免费国产| 91视频在线免费观看| 亚洲黄色影院| 亚洲区自拍偷拍| 91麻豆精品久久久久蜜臀| 蜜桃成人365av| 久久久水蜜桃| 蜜桃精品视频在线观看| 九九热视频精品| 精品伊人久久97| 黄色精品视频网站| www.九色.com| 久久精品亚洲乱码伦伦中文| 7777久久亚洲中文字幕| 久久久噜久噜久久综合| 神马香蕉久久| www.污网站| 天堂在线中文网官网| 国产精品免费一区二区三区观看| 国产精品久久久久久久久久妞妞 | 久久91精品| 一卡二卡三卡四卡五卡| 精品女同一区二区三区在线播放| 国产一区二区影视| 亚洲字幕一区二区| 久久不射中文字幕| 日韩成人毛片视频| 精品一区精品二区| 久久精品一级| aa免费在线观看| 亚洲黄色小说网站| 久草在线青青草| 51国产成人精品午夜福中文下载| 99成人在线| 免费在线观看a级片| 日韩www在线| 成人亚洲精品| 成人在线观看a| 亚洲一区二区精品久久av| 番号集在线观看| 精品久久久久久中文字幕动漫 |