专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » jvm调优:JVM的垃圾回收机制详解和调优 »正文

jvm调优:JVM的垃圾回收机制详解和调优

来源: 发布时间:星期一, 2009年3月16日 浏览:0次 评论:0
1.JVMgc概述   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阶段则把标记对象复制到堆栈新域中以便压缩堆栈这种收集器也停止其他操作 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使用分代收集器它把堆分为 3个主要域:新域、旧域以及永久域Jvm生成所有新对象放在新域中旦对象经历了定数量垃圾收集循环后便获得使用期并进入旧域在永久域中jvm则存储和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在新域中使用复制收集器该域般分为 3个部分部分为Eden用于生成新对象另两部分称为救助空间当Eden充满时收集器停止应用把所有可到达对象复制到当前from救助空间旦当前from救助空间充满收集器则把可到达对象复制到当前to救助空间From和to救助空间互换角色维持活动对象将在救助空间不断复制直到它们获得使用期并转入旧域使用-XX:SurvivorRatio可控制新域子空间大小   同NewRationSurvivorRation规定某救助域和Eden空间比值比如以下命令把新域设置成64mEden占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.并行收集器  该收集器也停止其他进程工作但使用多线程以加速收集进程尽管它比其他收集器易于引起长时间中断般能更好利用内存效率也较高   默认状态下JRockit使用分代并发收集器要改变收集器可使用-Xgc:对应 4个收集器分别为gencopysinglecongencon以及parallel可使用-Xms和-Xmx设置堆大小和最大值要设置护理域则使用-Xns:java –jrockit –Xms512m –Xmx512m –Xgc:gencon –Xns128m…尽管JRockit支持-verbose:gc开关但它输出信息会因收集器区别而异JRockit还支持memory、load和codegen输出   注意 :如果 使用JRockit JVM话还可以使用WLS自带console(C:\bea\jrockit81sp1_141_03\bin下)来监控些数据如cpumemery等要想能构监控必须在启动服务时startWeblogic.cmd中加入-Xmanagement参数 5.如何从JVM中获取信息来进行调整   -verbose.gc开关可显示gc操作内容打开它可以显示最忙和最空闲收集行为发生时间、收集前后内存大小、收集需要时间等打开-xx:+ prgcdetails开关可以详细了解gc中变化打开-XX: + PrGCTimeStamps开关可以了解这些垃圾收集发生时间自jvm启动以后以秒计量最后通过-xx: + PrHeapAtGC开关了解堆更详细信息为了了解新域情况可以通过-XX:=PrTenuringDistribution开关了解获得使用期对象权 6.Pdm系统JVM调整   6.1.服务器:前提内存1G 单CPU   可通过如下参数进行调整:-server 启用服务器模式(如果CPU多服务器机建议使用此项)   -Xms,-Xmx般设为同样大小 800m   -Xmn 是将NewSize和MaxNewSize设为320m   -XX:PerSize 64m   -XX:NewSize 320m 此值设大可调大新对象区减少Full GC次数  -XX:MaxNewSize 320m   -XX:NewRato NewSize设了可不设4   -XX: SurvivorRatio 4   -XX:userParNewGC 可用来设置并行收集   -XX:ParallelGCThreads 可用来增加并行度 4   -XXUseParallelGC 设置后可以使用并行清除收集器  -XX:UseAdaptiveSizePolicy 和上面个联合使用效果更好利用它可以自动优化新域大小以及救助空间比值   6.2.客户机:通过在JNLP文件中设置参数来调整客户端JVM   JNLP中参数:initial-heap-size和max-heap-size   这可以在frameworkRequestManager中生成JNLP文件时加入上述参数但是这些值是要求根据客户机硬件状态变化(如客户机内存大小等)建议这两个参数值设为客户机可用内存60%(有待测试)为了在动态生成JNLP时以上两个参数值能够随客户机区别而区别可靠虑获得客户机系统信息并将这些嵌到首页index.jsp中作为连接请求参数   在设置了上述参数后可以通过Visualgc 来观察垃圾回收些参数状态再做相应调整来改善性能标准是减少fullgc次数最好硬件支持使用并行垃圾回收(要求多CPU)

TAG: JVM 机制 垃圾 详解
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: