国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Java垃圾回收調優(yōu) – Tim[后端技術]
Java垃圾回收調優(yōu)
Wednesday, Jan 7th, 2009 by Tim | Tags:GC,Java
在Java中,通常通訊類型的服務器對GC(Garbage Collection)比較敏感。通常通訊服務器每秒需要處理大量進出的數(shù)據(jù)包,需要解析,分解成不同的業(yè)務邏輯對象并做相關的業(yè)務處理,這樣會導致大量的臨時對象被創(chuàng)建和回收。同時服務器如果需要同時保存用戶狀態(tài)的話,又會產生很多永久的對象,比如用戶session。業(yè)務越復雜的應用往往用戶session包含的引用對象就越多。這樣在極端情況下會發(fā)生兩件事情,long gc pause time 或 out of memory。
一,要解決long pause time首先要了解JVM中heap的結構
java gc heap
Java Heap為什么要分成幾個不同的代(generation)? 由于80%-98%的對象的生存周期很短,大部分新對象存放在young generation可以很高效的回收,避免遍歷所有對象。
young與old中內存分配的算法完全不同。young generation中由于存活的很少,要mark, sweep 然后再 compact 剩余的對象比較耗時,干脆把 live object copy 到另外一個空間更高效。old generation完全相反,里面的 live object 變化較少。因此采用 mark-sweep-compact更合適。
二,Java中四種垃圾回收算法
Java中有四種不同的回收算法,對應的啟動參數(shù)為
–XX:+UseSerialGC
–XX:+UseParallelGC
–XX:+UseParallelOldGC
–XX:+UseConcMarkSweepGC
1. Serial Collector
大部分平臺或者強制 java -client 默認會使用這種。
young generation算法 = serial
old generation算法 = serial (mark-sweep-compact)
這種方法的缺點很明顯,stop-the-world, 速度慢。服務器應用不推薦使用。
2. Parallel Collector
在linux x64上默認是這種,其他平臺要加 java -server 參數(shù)才會默認選用這種。
young = parallel,多個thread同時copy
old = mark-sweep-compact = 1
優(yōu)點:新生代回收更快。因為系統(tǒng)大部分時間做的gc都是新生代的,這樣提高了throughput(cpu用于非gc時間)
缺點:當運行在8G/16G server上old generation live object太多時候pause time過長
3. Parallel Compact Collector (ParallelOld)
young = parallel = 2
old = parallel,分成多個獨立的單元,如果單元中l(wèi)ive object少則回收,多則跳過
優(yōu)點:old old generation上性能較 parallel 方式有提高
缺點:大部分server系統(tǒng)old generation內存占用會達到60%-80%, 沒有那么多理想的單元live object很少方便迅速回收,同時compact方面開銷比起parallel并沒明顯減少。
4. Concurent Mark-Sweep(CMS) Collector
young generation = parallel collector = 2
old = cms
同時不做 compact 操作。
優(yōu)點:pause time會降低, pause敏感但CPU有空閑的場景需要建議使用策略4.
缺點:cpu占用過多,cpu密集型服務器不適合。另外碎片太多,每個object的存儲都要通過鏈表連續(xù)跳n個地方,空間浪費問題也會增大。
幾條經(jīng)驗:
1. java -server
2. 設置Xms=Xmx=3/4物理內存
3. 如果是CPU密集型服務器,使用–XX:+UseParallelOldGC, 否則–XX:+UseConcMarkSweepGC
4. 新生代,Parallel/ParallelOld可設大于Xmx1/4,CMS可設小,小于Xmx1/4
5. 優(yōu)化程序,特別是每個用戶的session中的集合類等。我們的一個模塊中session中曾經(jīng)為每個用戶使用了一個ConcurrentHashMap, 里面通常只有幾條記錄,后來改成數(shù)組之后,每臺機大概節(jié)約了1~2G內存。
不過總的說來,Java的GC算法感覺是業(yè)界最成熟的,目前很多其他語言或者框架也都支持GC了,但大多數(shù)都是只達到Java Serial gc這種層面,甚至分generation都未考慮。JDK7里面針對CMS又進行了一種改進,會采用一種G1(Garbage-First Garbage Collection)的算法。實際上Garbage-First paper(PDF) 2004年已經(jīng)出來了,相信到JDK7已經(jīng)可以用于嚴格生產環(huán)境,有時間也會進一步介紹一下G1。
另外在今年的Sun Tech Days上Joey Shen講的Improving Java Performance(PDF)也是一個很好的Java GC調優(yōu)的入門教程。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中的垃圾回收機制
JVM內存模型以及垃圾收集策略解析【續(xù)】 - 信心,恒心,野心,愛心兼具者,可謂準成功人士...
一文弄清Java的經(jīng)典垃圾收集器
JVM垃圾收集器
聊聊JVM(一)相對全面的GC總結
java基礎之GC
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服