自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JVM基礎(chǔ):GC策略&內(nèi)存申請(qǐng)、對(duì)象衰老

開發(fā) 后端
JVM(采用分代回收的策略),用較高的頻率對(duì)年輕的對(duì)象(young generation)進(jìn)行YGC,而對(duì)老對(duì)象(tenured generation)較少(tenured generation 滿了后才進(jìn)行)進(jìn)行Full GC。這樣就不需要每次GC都將內(nèi)存中所有對(duì)象都檢查一遍。

JVM里的GC(Garbage Collection)的算法有很多種,如標(biāo)記清除收集器,壓縮收集器,分代收集器等等,詳見HotSpot VM GC 的種類

現(xiàn)在比較常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即將內(nèi)存分為幾個(gè)區(qū)域,將不同生命周期的對(duì)象放在不同區(qū)域里:young generation,tenured generation和permanet generation。絕大部分的objec被分配在young generation(生命周期短),并且大部分的object在這里die。當(dāng)young generation滿了之后,將引發(fā)minor collection(YGC)。在minor collection后存活的object會(huì)被移動(dòng)到tenured generation(生命周期比較長(zhǎng))。最后,tenured generation滿之后觸發(fā)major collection。major collection(Full gc)會(huì)觸發(fā)整個(gè)heap的回收,包括回收young generation。permanet generation區(qū)域比較穩(wěn)定,主要存放classloader信息。

young generation有eden、2個(gè)survivor 區(qū)域組成。其中一個(gè)survivor區(qū)域一直是空的,是eden區(qū)域和另一個(gè)survivor區(qū)域在下一次copy collection后活著的objecy的目的地。object在survivo區(qū)域被復(fù)制直到轉(zhuǎn)移到tenured區(qū)。

我們要盡量減少 Full gc 的次數(shù)(tenured generation 一般比較大,收集的時(shí)間較長(zhǎng),頻繁的Full gc會(huì)導(dǎo)致應(yīng)用的性能收到嚴(yán)重的影響)。

堆內(nèi)存GC

JVM(采用分代回收的策略),用較高的頻率對(duì)年輕的對(duì)象(young generation)進(jìn)行YGC,而對(duì)老對(duì)象(tenured generation)較少(tenured generation 滿了后才進(jìn)行)進(jìn)行Full GC。這樣就不需要每次GC都將內(nèi)存中所有對(duì)象都檢查一遍。

非堆內(nèi)存不GC

GC不會(huì)在主程序運(yùn)行期對(duì)PermGen Space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS(特別是動(dòng)態(tài)生成類,當(dāng)然permgen space存放的內(nèi)容不僅限于類)的話,就很可能出現(xiàn)PermGen Space錯(cuò)誤。

內(nèi)存申請(qǐng)、對(duì)象衰老過程

一、內(nèi)存申請(qǐng)過程

•JVM會(huì)試圖為相關(guān)Java對(duì)象在Eden中初始化一塊內(nèi)存區(qū)域;

•當(dāng)Eden空間足夠時(shí),內(nèi)存申請(qǐng)結(jié)束。否則到下一步;

•JVM試圖釋放在Eden中所有不活躍的對(duì)象(minor collection),釋放后若Eden空間仍然不足以放入新對(duì)象,則試圖將部分Eden中活躍對(duì)象放入Survivor區(qū);

•Survivor區(qū)被用來作為Eden及old的中間交換區(qū)域,當(dāng)OLD區(qū)空間足夠時(shí),Survivor區(qū)的對(duì)象會(huì)被移到Old區(qū),否則會(huì)被保留在Survivor區(qū);

•當(dāng)old區(qū)空間不夠時(shí),JVM會(huì)在old區(qū)進(jìn)行major collection;

•完全垃圾收集后,若Survivor及old區(qū)仍然無法存放從Eden復(fù)制過來的部分對(duì)象,導(dǎo)致JVM無法在Eden區(qū)為新對(duì)象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)"Out of memory錯(cuò)誤";

二、對(duì)象衰老過程

•新創(chuàng)建的對(duì)象的內(nèi)存都分配自eden。Minor collection的過程就是將eden和在用survivor space中的活對(duì)象copy到空閑survivor space中。對(duì)象在young generation里經(jīng)歷了一定次數(shù)(可以通過參數(shù)配置)的minor collection后,就會(huì)被移到old generation中,稱為tenuring。

•GC觸發(fā)條件

GC類型 觸發(fā)條件 觸發(fā)時(shí)發(fā)生了什么 注意 查看方式
YGC eden空間不足

清空Eden+from survivor中所有no ref的對(duì)象占用的內(nèi)存
將eden+from sur中所有存活的對(duì)象copy到to sur中
一些對(duì)象將晉升到old中:
to sur放不下的
存活次數(shù)超過turning threshold中的
重新計(jì)算tenuring threshold(serial parallel GC會(huì)觸發(fā)此項(xiàng))

重新調(diào)整Eden 和from的大小(parallel GC會(huì)觸發(fā)此項(xiàng))

全過程暫停應(yīng)用
是否為多線程處理由具體的GC決定
jstat –gcutil
gc log
FGC

old空間不足
perm空間不足
顯示調(diào)用System.GC, RMI等的定時(shí)觸發(fā)
YGC時(shí)的悲觀策略
dump live的內(nèi)存信息時(shí)(jmap –dump:live)

清空heap中no ref的對(duì)象
permgen中已經(jīng)被卸載的classloader中加載的class信息

如配置了CollectGenOFirst,則先觸發(fā)YGC(針對(duì)serial GC)
如配置了ScavengeBeforeFullGC,則先觸發(fā)YGC(針對(duì)serial GC)

 
全過程暫停應(yīng)用
是否為多線程處理由具體的GC決定

是否壓縮需要看配置的具體GC
jstat –gcutil
gc log

permanent generation空間不足會(huì)引發(fā)Full GC,仍然不夠會(huì)引發(fā)PermGen Space錯(cuò)誤。

參考:

http://jiangyongyuan.javaeye.com/blog/356502

http://www.helloying.com/blog/archives/164

相關(guān)內(nèi)容推薦:

GC悲觀策略之Parallel GC篇

GC悲觀策略之Serial GC篇

原文鏈接:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037056.html

【系列文章】

  1. JVM基礎(chǔ):JVM監(jiān)測(cè)&工具
  2. JVM基礎(chǔ):生產(chǎn)環(huán)境參數(shù)實(shí)例及分析
  3. JVM基礎(chǔ):JVM參數(shù)設(shè)置、分析
  4. JVM基礎(chǔ):JVM內(nèi)存組成及分配
  5. JVM基礎(chǔ):JVM監(jiān)測(cè)&工具
責(zé)任編輯:林師授 來源: redcreen的博客
相關(guān)推薦

2022-05-27 08:01:36

JVM內(nèi)存收集器

2018-04-08 08:45:53

對(duì)象內(nèi)存策略

2019-12-10 08:59:55

JVM內(nèi)存算法

2012-01-11 10:45:57

JavaJVM

2019-09-02 14:53:53

JVM內(nèi)存布局GC

2010-09-27 09:01:26

JVM分代垃圾回收

2021-01-21 08:00:25

JVM

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2021-04-14 10:14:34

JVM生產(chǎn)問題定位內(nèi)存泄露

2011-12-20 10:43:21

Java

2023-08-24 07:46:21

服務(wù)器JVM

2011-12-05 12:51:58

JVMJava

2010-01-06 09:28:08

JVM分代垃圾回收

2018-07-04 14:43:55

對(duì)象模型內(nèi)存結(jié)構(gòu)內(nèi)存模型

2017-09-26 16:32:03

JavaGC分析

2010-09-26 11:22:22

JVM垃圾回收JVM

2021-04-12 09:36:14

JVM生產(chǎn)問題JVM FULL GC

2017-09-20 08:48:09

JVM內(nèi)存結(jié)構(gòu)

2012-01-11 13:04:40

JavaJVM

2009-07-08 15:11:58

JVM GC調(diào)整優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)