??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产视频网站,中文字幕一区二区三中文字幕,在线日韩一区二区http://www.aygfsteel.com/WutongDeath/zh-cnThu, 19 Jun 2025 10:37:57 GMTThu, 19 Jun 2025 10:37:57 GMT60Java的垃圑֛收机制详解和调优http://www.aygfsteel.com/WutongDeath/archive/2008/03/31/189751.html梧桐梧桐Mon, 31 Mar 2008 04:34:00 GMThttp://www.aygfsteel.com/WutongDeath/archive/2008/03/31/189751.htmlhttp://www.aygfsteel.com/WutongDeath/comments/189751.htmlhttp://www.aygfsteel.com/WutongDeath/archive/2008/03/31/189751.html#Feedback0http://www.aygfsteel.com/WutongDeath/comments/commentRss/189751.htmlhttp://www.aygfsteel.com/WutongDeath/services/trackbacks/189751.html  1.JVM的gc概述
  
  gc卛_圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言q不要求jvm有gcQ也没有规定gc如何工作。不q常用的jvm都有gcQ而且大多数gc都用类似的法理内存和执行收集操作?br />   
  在充分理解了垃圾攉法和执行过E后Q才能有效的优化它的性能。有些垃圾收集专用于Ҏ(gu)的应用程序。比如,实时应用E序主要是ؓ了避免垃圾收集中断,而大多数OLTP应用E序则注重整体效率。理解了应用E序的工作负荷和jvm支持的垃圾收集算法,便可以进行优化配|垃圾收集器?br />   
  垃圾攉的目的在于清除不再用的对象。gc通过定对象是否被活动对象引用来定是否攉该对象。gc首先要判断该对象是否是时候可以收集。两U常用的Ҏ(gu)是引用计数和对象引用遍历?br />   
  1.1.引用计数
  

  引用计数存储对特定对象的所有引用数Q也是_当应用程序创建引用以及引用超围时Qjvm必须适当增减引用数。当某对象的引用Cؓ0Ӟ便可以进行垃圾收集?br />   
  1.2.对象引用遍历
  

  早期的jvm使用引用计数Q现在大多数jvm采用对象引用遍历。对象引用遍历从一l对象开始,沿着整个对象图上的每条链接,递归定可到达(reachableQ的对象。如果某对象不能从这些根对象的一个(臛_一个)到达Q则它作ؓ垃圾攉。在对象遍历阶段Qgc必须C哪些对象可以到达Q以便删除不可到辄对象Q这UCؓ标记QmarkingQ对象?br />   
  下一步,gc要删除不可到辄对象。删除时Q有些gc只是单的扫描堆栈Q删除未标记的未标记的对象,q攑֮们的内存以生成新的对象,q叫做清除(sweepingQ。这U方法的问题在于内存会分成好多小D,而它们不以用于新的对象Q但是组合v来却很大。因此,许多gc可以重新l织内存中的对象Qƈq行压羃QcompactQ,形成可利用的I间?br />   
  为此Qgc需要停止其他的zdzd。这U方法意味着所有与应用E序相关的工作停止,只有gcq行。结果,在响应期间增减了许多hh。另外,更复杂的 gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线E完成这工作,有的则采用多U程以增加效率?br />   
  2.几种垃圾回收机制
  
  2.1.标记Q清除收集器
  

  q种攉器首先遍历对象图q标记可到达的对象,然后扫描堆栈以寻找未标记对象q攑֮们的内存。这U收集器一般用单U程工作q停止其他操作?br />   
  2.2.标记Q压~收集器
  

  有时也叫标记Q清除-压羃攉器,与标讎ͼ清除攉器有相同的标记阶Dc在W二阶段Q则把标记对象复制到堆栈的新域中以便压羃堆栈。这U收集器也停止其他操作?br />   
  2.3.复制攉?br />   
  q种攉器将堆栈分ؓ两个域,常称为半I间。每ơ仅使用一半的I间Qjvm生成的新对象则放在另一半空间中。gcq行Ӟ它把可到辑֯象复制到另一半空_从而压~了堆栈。这U方法适用于短生存期的对象Q持l复刉生存期的对象则导致效率降低?br />   
  2.4.增量攉?br />   
  增量攉器把堆栈分ؓ多个域,每次仅从一个域攉垃圾。这会造成较小的应用程序中断?br />   
  2.5.分代攉?br />   
  q种攉器把堆栈分ؓ两个或多个域Q用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一D|_l箋存在的对象将获得使用期ƈ转入更长寿命的域中。分代收集器对不同的域用不同的法以优化性能?br />   
  2.6.q发攉?br />   
  q发攉器与应用E序同时q行。这些收集器在某点上Q比如压~时Q一般都不得不停止其他操作以完成特定的Q务,但是因ؓ其他应用E序可进行其他的后台操作Q所以中断其他处理的实际旉大大降低?br />   
  2.7.q行攉?br />   
  q行攉器用某U传l的法q用多U程q行的执行它们的工作。在多cpu机器上用多U程技术可以显著的提高java应用E序的可扩展性?br />   
  3.Sun HotSpot
  
  1.4.1 JVM堆大的调整
  
  Sun HotSpot 1.4.1使用分代攉器,它把堆分Z个主要的域:新域、旧域以及永久域。Jvm生成的所有新对象攑֜新域中。一旦对象经历了一定数量的垃圾攉循环后,便获得用期q进入旧域。在怹域中jvm则存储class和method对象。就配置而言Q永久域是一个独立域q且不认为是堆的一部分?br />   
  下面介绍如何控制q些域的大小。可使用-Xms?Xmx 控制整个堆的原始大小或最大倹{?br />   
  下面的命令是把初始大设|ؓ128MQ?br />   
  java –Xms128m
  
  –Xmx256m为控制新域的大小Q可使用-XX:NewRatio讄新域在堆中所占的比例?br />   
  下面的命令把整个堆设|成128mQ新域比率设|成3Q即新域与旧域比例ؓ1Q?Q新域ؓ堆的1/4?2MQ?br />   
  java –Xms128m –Xmx128m
  –XX:NewRatio =3可?XX:NewSize?XX:MaxNewsize讄新域的初始值和最大倹{?br />   
  下面的命令把新域的初始值和最大D|成64m:
  
  java –Xms256m –Xmx256m –Xmn64m
  
  怹域默认大ؓ4m。运行程序时Qjvm会调整永久域的大以满需要。每ơ调整时Qjvm会对堆进行一ơ完全的垃圾攉?br />   
  使用-XX:MaxPerSize标志来增加永久域搭大。在WebLogic Server应用E序加蝲较多cLQ经帔R要增加永久域的最大倹{当jvm加蝲cLQ永久域中的对象急剧增加Q从而jvm不断调整怹域大。ؓ了避免调_可?XX:PerSize标志讄初始倹{?br />   
  下面把永久域初始D|成32mQ最大D|成64m?br />   
  java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m
  
  默认状态下QHotSpot在新域中使用复制攉器。该域一般分Z个部分。第一部分为EdenQ用于生成新的对象。另两部分称为救助空_当Eden 充满Ӟ攉器停止应用程序,把所有可到达对象复制到当前的from救助I间Q一旦当前的from救助I间充满Q收集器则把可到辑֯象复制到当前的to救助I间。From和to救助I间互换角色。维持活动的对象在救助I间不断复制Q直到它们获得用期q{入旧域。?XX:SurvivorRatio 可控制新域子I间的大?br />   
  同NewRation一PSurvivorRation规定某救助域与EdenI间的比倹{比如,以下命o把新域设|成64mQEden?2mQ每个救助域各占16mQ?br />   
  java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2
  
  如前所qͼ默认状态下HotSpotҎ(gu)域用复制收集器Q对旧域使用标记Q清除-压羃攉器。在新域中用复制收集器有很多意义,因ؓ应用E序生成的大部分对象是短寿命的。理想状态下Q所有过渡对象在UdEdenI间时将被收集。如果能够这L话,q且UdEdenI间的对象是长寿命的Q那么理Z可以立即把它们移q旧域,避免在救助空间反复复制。但是,应用E序不能适合q种理想状态,因ؓ它们有一部分中长寿命的对象。最好是保持q些中长寿命的对象ƈ攑֜新域中,因ؓ复制部分的对象L压羃旧域廉h(hun)。ؓ控制新域中对象的复制Q可?XX:TargetSurvivorRatio控制救助I间的比例(该值是讄救助I间的用比例。如救助I间?MQ该?0表示可用500KQ。该值是一个百分比Q默认值是50。当较大的堆栈用较低的 sruvivorratioӞ应增加该值到80?0Q以更好利用救助I间。用-XX:maxtenuring threshold可控制上限?br />   
  为放|所有的复制全部发生以及希望对象从eden扩展到旧域,可以把MaxTenuring Threshold讄?。设|完成后Q实际上׃再用救助空间了Q因此应把SurvivorRatio设成最大g最大化EdenI间Q设|如下:
  
  java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatioQ?0000 …
  
  4.BEA JRockit JVM的?/strong>
  
  Bea WebLogic 8.1使用的新的JVM用于Intelq_。在Bea安装完毕的目录下可以看到有一个类gjrockit81sp1_141_03的文件夹。这是 Bea新JVM所在目录。不同于HotSpot把Java字节码编译成本地码,它预先编译成cRJRockitq提供了更细致的功能用以观察JVM的运行状态,主要是独立的GUI控制収ͼ只能适用于用Jrockit才能使用jrockit81sp1_141_03自带的console监控一些cpu?memory参数Q或者WebLogic Server控制台?br />   
  Bea JRockit JVM支持4U垃圾收集器Q?br />   
  4.1.分代复制攉?br />   
  它与默认的分代收集器工作{略cM。对象在新域中分配,即JRockit文档中的nursery。这U收集器最适合单cpuZ型堆操作?br />   
  4.2.单空间ƈ发收集器
  

  该收集器使用完整堆,q与背景U程共同工作。尽这U收集器可以消除中断Q但是收集器需p较长的时间寻找死对象Q而且处理应用E序时收集器l常q行。如果处理器不能应付应用E序产生的垃圾,它会中断应用E序q关闭收集?br />   
  分代q发攉器这U收集器在护理域使用排它复制攉器,在旧域中则用ƈ发收集器。由于它比单I间共同发生攉器中断频J,因此它需要较?yu)的内存Q应用程序的q行效率也较高,注意Q过的护理域可以导致大量的临时对象被扩展到旧域中。这会造成攉器超负荷q作Q甚至采用排它性工作方式完成收集?

梧桐 2008-03-31 12:34 发表评论
]]>
վ֩ģ壺 | | | | | | | Ϻӿ| | | ɶ| տ| | | ϴ| | | | | ˫| | | | | ٷ| ϰˮ| Ľ| | | | ߷| | ɽ| | ɽ| | | | | Դ| |