日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

JVM垃圾回收機制

系統 2366 0

?

每個Java程序員遲早都會碰到下面這個錯誤:

  • java.lang.OutOfMemoryError

這個時候一般會建議采用如下方式解決這個錯誤:

  • 增加MaxPermSize值
  • 增加最大堆內存到512M(-xmx參數)

這篇文章會具體介紹Java堆空間和參數MaxPermSize的含義。這篇文章涉及下列主題,并采用Hotspot JVM:

  • 垃圾回收器(Garbage Collector,GC)
  • 哪個 JVM?
  • JVM命令行選項

?

垃圾回收器

垃圾回收器負責:

  • 分配內存
  • 保證所有正在被引用的對象還存在于內存中
  • 回收執行代碼已經不再引用的對象所占的內存?

應用執行時,定位和回收垃圾對象的過程會占用總執行時間的將近25%,這會拖累應用的執行效率。


JVM垃圾回收機制

?

Hotspot VM提供的垃圾回收器是一個分代垃圾回收器(Generational GC)[9,16,18]-將內存劃分為不同的階段,也就是說,不同的生命周期的對象放置在不同的地址池中。這樣的設計是基于弱年代假設(Weak Generational Hypothesis):

1.越早分配的對象越容易失效;

2.老對象很少會引用新對象。

?

這種分代方式可以減少垃圾回收的停頓時間以及大范圍對象的回收成本。Hotspot VM將其堆空間分為三個分代空間:

1.? 年輕代 Young Generation

○???? Java應用在分配Java對象時,這些對象會被分配到年輕代堆空間中去

○???? 這個空間大多是小對象并且會被頻繁回收

○???? 由于年輕代堆空間的垃圾回收會很頻繁,因此其垃圾回收算法會更加重視回收效率

2.? 年老代 Old Generationn

○???? 年輕代堆空間的長期存活對象會轉移到(也許是永久性轉移)年老代堆空間

○???? 這個堆空間通常比年輕代的堆空間大,并且其空間增長速度較緩

○???? 由于大部分JVM堆空間都分配給了年老代,因此其垃圾回收算法需要更節省空間,此算法需要能夠處理低垃圾密度的堆空間

3.? 持久代 Permanent Generation

○???? 存放VM和Java類的元數據(metadata),以及interned字符串和類的靜態變量

?

次收集( Minor GC )和全收集( Full GC

當這三個分代的堆空間比較緊張或者沒有足夠的空間來為新到的請求分配的時候,垃圾回收機制就會起作用。有兩種類型的垃圾回收方式:次收集和全收集。當年輕代堆空間滿了的時候,會觸發次收集將還存活的對象移到年老代堆空間。當年老代堆空間滿了的時候,會觸發一個覆蓋全范圍的對象堆的全收集。

?

次收集

  • 當年輕代堆空間緊張時會被觸發
  • 相對于全收集而言,收集間隔較短

全收集

  • 當老年代或者持久代堆空間滿了,會觸發全收集操作
  • 可以使用System.gc()方法來顯式的啟動全收集
  • 全收集一般根據堆大小的不同,需要的時間不盡相同,但一般會比較長。不過,如果全收集時間超過3到5秒鐘,那就太長了[1]

?

全收集通常時間最長,并且是程序無法延遲執行或者無法達到吞吐量目標的主因。GC的目標是去減少程序運行過程中垃圾回收的頻率。為了達到這個目的,可以從這兩方面入手:

  • 從系統方面考慮:

○??? 盡量采用大堆,但是不要大到需要系統從磁盤上“換”頁。一般而言,可用的RAM(沒有被系統進程占用的)的80%都應該分配給JVM。

○??? Java堆空間越大,垃圾回收器和java應用在吞吐量( throughput )和延遲執行( latency )方面的效果越好。

  • 從應用方面考慮:

○??? 減少對象分配( object allocations )操作,或者采用對象保留( object retention )方式有助于減小存活的數據大小,這也可以反過來幫助垃圾回收做的更好。

○??? 參考這篇文章—Java性能提升竅門[19]

?

內存溢出錯誤( OutOfMemoryError

可怕的內存溢出錯誤是Java程序員最不愿意看到的。然而這個錯誤還是會出現,尤其應用中涉及到大量的數據處理時,或應用運行時間過長時。

一個應用所占內存大小包括:

  • Java堆大小
  • 線程棧
  • I/O緩沖區
  • 原生庫所分配的內存

?

當一個應用耗盡了內存并且JVM GC也無法回收任何對象空間的時候,就會發生內存溢出錯誤。但是,內存溢出錯誤并不一定就意味著內存泄露(memory leak)。也有可能只是一個配置問題,例如設置的堆大小(如果沒有設置那就是缺省的堆大小)對于應用來說是不夠用的。

?

JVM 命令行參數

無論是客戶端應用還是服務器端應用,一旦系統運行緩慢并且垃圾回收所占時間過長,你就會希望通過調整堆大小來改善這一點。不過,為了不影響其他也跑在同一個系統中的應用,不應該將堆大小設置的過大。

GC調優是很重要的。找到最佳的分代堆空間是一個迭代的過程[3,10,12]。這里我們假定你已經為你的應用找到了最佳堆大小。那么你可以采用下面的JVM命令來進行設置:


JVM垃圾回收機制

GC? 命令行選項 描述
-Xms 設置Java堆大小的初始值/最小值。例如:-Xms512m (請注意這里沒有”=”).
-Xmx 設置Java堆大小的最大值
-Xmn 設置年輕代對空間的初始值,最小值和最大值。請注意,年老代堆空間大小是依賴于年輕代堆空間大小的
-XX:PermSize=<n>[g|m|k] 設置持久代堆空間的初始值和最小值
-XX:MaxPermSize=<n>[g|m|k] 設置持久代堆空間的最大值

最后一點,最早在Java SE 5.0中有對服務器的人機工程學的介紹[13]。這個可以很好的減少服務器端應用的調優時間,尤其是在堆大小測量和復雜GC調優方面。很多情況下,服務器端調優的最好方式就是不去調優。

?

轉載地址:http://www.importnew.com/1551.html

?

?

?

?

?

JVM垃圾回收機制


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九龙城区| 博客| 绍兴市| 突泉县| 宁夏| 麦盖提县| 广灵县| 张家港市| 高碑店市| 承德市| 苗栗市| 宜州市| 灵寿县| 宜城市| 兴隆县| 祁门县| 九寨沟县| 绥芬河市| 盐源县| 资兴市| 襄城县| 会同县| 禹城市| 云浮市| 荣成市| 洛阳市| 吉林省| 青岛市| 商河县| 侯马市| 黔西县| 全椒县| 大关县| 新邵县| 抚宁县| 临朐县| 文昌市| 娱乐| 烟台市| 板桥市| 朝阳市|