快捷搜索:

JVM的垃圾回收机制详解和性能调优

1.JVM的gc概述

gc即垃圾网络机制是指jvm用于开释那些不再应用的工具所占用的内存。java说话并不要求jvm有gc,也没有规定gc若何事情。不过常用的jvm都有gc,而且大年夜多半gc都应用类似的算法治理内存和履行网络操作。

在充分理解了垃圾网络算法和履行历程后,才能有效的优化它的机能。有些垃圾网络专用于特殊的利用法度榜样。比如,实时利用法度榜样主如果为了避免垃圾网络中断,而大年夜多半OLTP利用法度榜样则重视整体效率。理解了利用法度榜样的事情负荷和jvm支持的垃圾网络算法,便可以进行优化设置设置设备摆设摆设垃圾网络器。

垃圾网络的目的在于清除不再应用的工具。gc经由过程确定工具是否被活动工具引用来确定是否网络该工具。gc首先要判断该工具是否是时刻可以网络。两种常用的措施是引用计数和工具引用遍历。

1.1.引用计数

引用计数存储对特定工具的所有引用数,也便是说,当利用法度榜样创建引用以及引用越过范围时,jvm必须适当增减引用数。当某工具的引用数为0时,便可以进行垃圾网络。

1.2.工具引用遍历

早期的jvm应用引用计数,现在大年夜多半jvm采纳工具引用遍历。工具引用遍历从一组工具开始,沿着全部工具图上的每条链接,递归确定可到达(reachable)的工具。假如某工具不能从这些根工具的一个(至少一个)到达,则将它作为垃圾网络。在工具遍历阶段,gc必须记着哪些工具可以到达,以便删除弗成到达的工具,这称为标记(marking)工具。

下一步,gc要删除弗成到达的工具。删除时,有些gc只是简单的扫描客栈,删除未标记的未标记的工具,并开释它们的内存以天生新的工具,这叫做清除(sweeping)。这种措施的问题在于内存会分成很多多幼年段,而它们不够以用于新的工具,然则组合起来却很大年夜。是以,许多gc可以从新组织内存中的工具,并进行压缩(compact),形成可使用的空间。

为此,gc必要竣事其他的活动活动。这种措施意味着所有与利用法度榜样相关的事情竣事,只有gc运行。结果,在相应时代增减了许多稠浊哀求。别的,更繁杂的gc赓续增添或同时运行以削减或者清除利用法度榜样的中断。有的gc应用单线程完成这项事情,有的则采纳多线程以增添效率。

2.几种垃圾收受接收机制

2.1.标记-清除网络器

这种网络器首先遍历工具图并标记可到达的工具,然后扫描客栈以探求未标记工具并开释它们的内存。这种网络器一样平常应用单线程事情并竣事其他操作。

2.2.标记-压缩网络器

无意偶尔也叫标记-清除-压缩网络器,与标记-清除网络器有相同的标记阶段。在第二阶段,则把标记工具复制到客栈的新域中以便压缩客栈。这种网络器也竣事其他操作。

2.3.复制网络器

这种网络器将客栈分为两个域,常称为半空间。每次仅应用一半的空间,jvm天生的新工具则放在另一半空间中。gc运行时,它把可到达工具复制到另一半空间,从而压缩了客栈。这种措施适用于短生计期的工具,持续复制永生计期的工具则导致效率低落。

2.4.增量网络器

增量网络器把客栈分为多个域,每次仅从一个域网络垃圾。这会造成较小的利用法度榜样中断。

2.5.分代网络器

这种网络器把客栈分为两个或多个域,用以寄放不合寿命的工具。jvm天生的新工具一样平常放在此中的某个域中。过一段光阴,继承存在的工具将得到应用期并转入更长命命的域中。分代网络器对不合的域应用不合的算法以优化机能。

2.6.并发网络器

并发网络器与利用法度榜样同时运行。这些网络器在某点上(比如压缩时)一样平常都不得不绝止其他操作以完成特定的义务,然则由于其他利用法度榜样可进行其他的后台操作,以是中断其他处置惩罚的实际光阴大年夜大年夜低落。

2.7.并行网络器

并行网络器应用某种传统的算法并应用多线程并行的履行它们的事情。在多cpu机械上应用多线程技巧可以显明的前进java利用法度榜样的可扩展性。

3.Sun HotSpot 1.4.1 JVM堆大年夜小的调剂

Sun HotSpot 1.4.1应用分代网络器,它把堆分为三个主要的域:新域、旧域以及永远域。Jvm天生的所有新工具放在新域中。一旦工具经历了必然数量的垃圾网络轮回后,便得到应用期并进入旧域。在永远域中jvm则存储class和method工具。就设置设置设备摆设摆设而言,永远域是一个自力域并且不觉得是堆的一部分。

下面先容若何节制这些域的大年夜小。可应用-Xms和-Xmx 节制全部堆的原始大年夜小或最大年夜值。

下面的敕令是把初始大年夜小设置为128M:

java –Xms128m

–Xmx256m为节制新域的大年夜小,可应用-XX:NewRatio设置新域在堆中所占的比例。

下面的敕令把全部堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M:

java –Xms128m –Xmx128m

–XX:NewRatio =3可应用-XX:NewSize和-XX:MaxNewsize设置新域的初始值和最大年夜值。

下面的敕令把新域的初始值和最大年夜值设置成64m:

java –Xms256m –Xmx256m –Xmn64m

永远域默认大年夜小为4m。运行法度榜样时,jvm会调剂永远域的大年夜小以满意必要。每次调剂时,jvm会对堆进行一次完全的垃圾网络。

应用-XX:MaxPerSize标志来增添永远域搭大年夜小。在WebLogic Server利用法度榜样加载较多类时,常常必要增添永远域的最大年夜值。当jvm加载类时,永远域中的工具急剧增添,从而使jvm赓续调剂永远域大年夜小。为了避免调剂,可应用-XX:PerSize标志设置初始值。

下面把永远域初始值设置成32m,最大年夜值设置成64m。

java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m

默认状态下,HotSpot在新域中应用复制网络器。该域一样平常分为三个部分。第一部分为Eden,用于天生新的工具。另两部分称为救助空间,当Eden充溢时,网络器竣事利用法度榜样,把所有可到达工具复制到当前的from救助空间,一旦当前的from救助空间充溢,网络器则把可到达工具复制到当前的to救助空间。From和to救助空间交换角色。保持活动的工具将在救助空间赓续复制,直到它们得到应用期并转入旧域。应用-XX:SurvivorRatio可节制新域子空间的大年夜小。

同NewRation一样,SurvivorRation规定某救助域与Eden空间的比值。比如,以下敕令把新域设置成64m,Eden占32m,每个救助域各占16m:

java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2

如前所述,默认状态下HotSpot对新域应用复制网络器,对旧域应用标记-清除-压缩网络器。在新域中应用复制网络器有很多意义,由于利用法度榜样天生的大年夜部分工具是短折命的。抱负状态下,所有过渡工具在移出Eden空间时将被网络。假如能够这样的话,并且移出Eden空间的工具是长命命的,那么理论上可以急速把它们移进旧域,避免在救助空间反复复制。然则,利用法度榜样不能得当这种抱负状态,由于它们有一小部分中长命命的工具。最好是维持这些中长命命的工具并放在新域中,由于复制小部分的工具总比压缩旧域廉价。为节制新域中工具的复制,可用-XX:TargetSurvivorRatio节制救助空间的比例(该值是设置救助空间的应用比例。如救助空间位1M,该值50表示可用500K)。该值是一个百分比,默认值是50。当较大年夜的客栈应用较低的sruvivorratio时,应增添该值到80至90,以更好使用救助空间。用-XX:maxtenuring threshold可节制上限。

为放置所有的复制整个发生以及盼望工具从eden扩展到旧域,可以把MaxTenuring Threshold设置成0。设置完成后,实际上就不再应用救助空间了,是以应把SurvivorRatio设成最大年夜值以最大年夜化Eden空间,设置如下:

java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …

4.BEA JRockit JVM的应用

Bea WebLogic 8.1应用的新的JVM用于Intel平台。在Bea安装完毕的目录下可以看到有一个类似于jrockit81sp1_141_03的文件夹。这便是Bea新JVM所在目录。不合于HotSpot把Java字节码编译成本地码,它预先编译成类。JRockit还供给了更细致的功能用以察看JVM的运行状态,主如果自力的GUI节制台(只能适用于应用Jrockit才能应用jrockit81sp1_141_03自带的console监控一些cpu及memory参数)或者WebLogic Server节制台。

Bea JRockit JVM支持4种垃圾网络器:

4.1.1.分代复制网络器

它与默认的分代网络器事情策略类似。工具在新域平分配,即JRockit文档中的nursery。这种网络器最得当单cpu机上小型堆操作。

4.1.2.单空间并发网络器

该网络器应用完备堆,并与背景线程合营事情。只管这种网络器可以打消中断,然则网络器需花费较长的光阴探求逝世工具,而且处置惩罚利用法度榜样时网络器常常运行。假如处置惩罚器不能敷衍利用法度榜样孕育发生的垃圾,它会中断利用法度榜样并关闭网络。

分代并发网络器 这种网络器在照料护士域应用排它复制网络器,在旧域中则应用并发网络器。因为它比单空间合营发生网络器中断频繁,是以它必要较少的内存,利用法度榜样的运行效率也较高,留意,过小的照料护士域可以导致大年夜量的临时工具被扩展到旧域中。这会造成网络器超负荷运作,以致采纳排它性事情要领完成网络。

4.1.3.并行网络器

该网络器也竣事

您可能还会对下面的文章感兴趣: