`
AnonymMan
  • 浏览: 23704 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Understanding CMS GC Logs

    博客分类:
  • JVM
JVM 
阅读更多

From   https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs

CMS GC with -XX:+PrintGCDetails and -XX:+PrintGCTimeStamps prints a lot of information. Understanding this information can help in fine tuning various parameters of the application and CMS to achieve best performance.

Let's have a look at some of the CMS logs generated with 1.4.2_10:

39.910: [GC 39.910: [ParNew: 261760K->0K(261952K), 0.2314667 secs] 262017K->26386K(1048384K), 0.2318679 secs]

Young generation (ParNew) collection. Young generation capacity is 261952K and after the collection its occupancy drops down from 261760K to 0. This collection took 0.2318679 secs.

40.146: [GC [1 CMS-initial-mark: 26386K(786432K)] 26404K(1048384K), 0.0074495 secs]

Beginning of tenured generation collection with CMS collector. This is initial Marking phase of CMS where all the objects directly reachable from roots are marked and this is done with all the mutator threads stopped.

Capacity of tenured generation space is 786432K and CMS was triggered at the occupancy of 26386K.

40.154: [CMS-concurrent-mark-start]

Start of concurrent marking phase. 
In Concurrent Marking phase, threads stopped in the first phase are started again and all the objects transitively reachable from the objects marked in first phase are marked here.

40.683: [CMS-concurrent-mark: 0.521/0.529 secs]

Concurrent marking took total 0.521 seconds cpu time and 0.529 seconds wall time that includes the yield to other threads also.

40.683: [CMS-concurrent-preclean-start]

Start of precleaning. 
Precleaning is also a concurrent phase. Here in this phase we look at the objects in CMS heap which got updated by promotions from young generation or new allocations or got updated by mutators while we were doing the concurrent marking in the previous concurrent marking phase. By rescanning those objects concurrently, the precleaning phase helps reduce the work in the next stop-the-world “remark” phase.

40.701: [CMS-concurrent-preclean: 0.017/0.018 secs]

Concurrent precleaning took 0.017 secs total cpu time and 0.018 wall time.

40.704: [GC40.704: [Rescan (parallel) , 0.1790103 secs]40.883: [weak refs processing, 0.0100966 secs] [1 CMS-remark: 26386K(786432K)] 52644K(1048384K), 0.1897792 secs]

Stop-the-world phase. This phase rescans any residual updated objects in CMS heap, retraces from the roots and also processes Reference objects. Here the rescanning work took 0.1790103 secs and weak reference objects processing took 0.0100966 secs. This phase took total 0.1897792 secs to complete.

40.894: [CMS-concurrent-sweep-start]

Start of sweeping of dead/non-marked objects. Sweeping is concurrent phase performed with all other threads running.

41.020: [CMS-concurrent-sweep: 0.126/0.126 secs]

Sweeping took 0.126 secs.

41.020: [CMS-concurrent-reset-start]

Start of reset.

41.147: [CMS-concurrent-reset: 0.127/0.127 secs]

In this phase, the CMS data structures are reinitialized so that a new cycle may begin at a later time. In this case, it took 0.127 secs.

This was how a normal CMS cycle runs. Now let us look at some other CMS log entries:

197.976: [GC 197.976: [ParNew: 260872K->260872K(261952K), 0.0000688 secs]197.976: [CMS197.981: [CMS-concurrent-sweep: 0.516/0.531 secs]
(concurrent mode failure): 402978K->248977K(786432K), 2.3728734 secs] 663850K->248977K(1048384K), 2.3733725 secs]

This shows that a ParNew collection was requested, but it was not attempted because it was estimated that there was not enough space in the CMS generation to promote the worst case surviving young generation objects. We name this failure as “full promotion guarantee failure”.

Due to this, Concurrent Mode of CMS is interrupted and a Full GC is invoked at 197.981. This mark-sweep-compact stop-the-world Full GC took 2.3733725 secs and the CMS generation space occupancy dropped from 402978K to 248977K.

The concurrent mode failure can either be avoided by increasing the tenured generation size or initiating the CMS collection at a lesser heap occupancy by setting CMSInitiatingOccupancyFraction to a lower value and setting UseCMSInitiatingOccupancyOnly to true. The value for CMSInitiatingOccupancyFraction should be chosen appropriately because setting it to a very low value will result in too frequent CMS collections.

Sometimes we see these promotion failures even when the logs show that there is enough free space in tenured generation. The reason is 'fragmentation' - the free space available in tenured generation is not contiguous, and promotions from young generation require a contiguous free block to be available in tenured generation. CMS collector is a non-compacting collector, so can cause fragmentation of space for some type of applications. In his blog, Jon talks in detail on how to deal with this fragmentation problem:
http://blogs.sun.com/roller/page/jonthecollector?entry=when_the_sum_of_the

Starting with 1.5, for the CMS collector, the promotion guarantee check is done differently. Instead of assuming that the promotions would be worst case i.e. all of the surviving young generation objects would get promoted into old gen, the expected promotion is estimated based on recent history of promotions. This estimation is usually much smaller than the worst case promotion and hence requires less free space to be available in old generation. And if the promotion in a scavenge attempt fails, then the young generation is left in a consistent state and a stop-the-world mark-compact collection is invoked. To get the same functionality with UseSerialGC you need to explicitly specify the switch -XX:+HandlePromotionFailure.

283.736: [Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000615 secs] 826554K->826554K(1048384K), 0.0003259 secs]
GC locker: Trying a full collection because scavenge failed
283.736: [Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs]

Stop-the-world GC happening when a JNI Critical section is released. Here again the young generation collection failed due to “full promotion guarantee failure” and then the Full GC is being invoked.

CMS can also be run in incremental mode (i-cms), enabled with -XX:+CMSIncrementalMode. In this mode, CMS collector does not hold the processor for the entire long concurrent phases but periodically stops them and yields the processor back to other threads in application. It divides the work to be done in concurrent phases in small chunks(called duty cycle) and schedules them between minor collections. This is very useful for applications that need low pause times and are run on machines with small number of processors.

Some logs showing the incremental CMS.

2803.125: [GC 2803.125: [ParNew: 408832K->0K(409216K), 0.5371950 secs] 611130K->206985K(1048192K) icms_dc=4 , 0.5373720 secs]
2824.209: [GC 2824.209: [ParNew: 408832K->0K(409216K), 0.6755540 secs] 615806K->211897K(1048192K) icms_dc=4 , 0.6757740 secs]

Here, the scavenges took respectively 537 ms and 675 ms. In between these two scavenges, iCMS ran for a brief period as indicated by the icms_dc value, which indicates a duty-cycle. In this case the duty cycle was 4%. A simple calculation shows that the iCMS incremental step lasted for 4/100 \* (2824.209 - 2803.125 - 0.537) = 821 ms, i.e. 4% of the time between the two scavenges.

Starting with 1.5, CMS has one more phase – concurrent abortable preclean. Abortable preclean is run between a 'concurrent preclean' and 'remark' until we have the desired occupancy in eden. This phase is added to help schedule the 'remark' phase so as to avoid back-to-back pauses for a scavenge closely followed by a CMS remark pause. In order to maximally separate a scavenge from a CMS remark pause, we attempt to schedule the CMS remark pause roughly mid-way between scavenges.

There is a second reason why we do this. Immediately following a scavenge there are likely a large number of grey objects that need rescanning. The abortable preclean phase tries to deal with such newly grey objects thus reducing a subsequent CMS remark pause.

The scheduling of 'remark' phase can be controlled by two jvm options CMSScheduleRemarkEdenSizeThreshold and CMSScheduleRemarkEdenPenetration. The defaults for these are 2m and 50% respectively. The first parameter determines the Eden size below which no attempt is made to schedule the CMS remark pause because the pay off is expected to be minuscule. The second parameter indicates the Eden occupancy at which a CMS remark is attempted.

After 'concurrent preclean' if the Eden occupancy is above CMSScheduleRemarkEdenSizeThreshold, we start 'concurrent abortable preclean' and continue precleanig until we have CMSScheduleRemarkEdenPenetration percentage occupancy in eden, otherwise we schedule 'remark' phase immediately.

7688.150: [CMS-concurrent-preclean-start]
7688.186: [CMS-concurrent-preclean: 0.034/0.035 secs]
7688.186: [CMS-concurrent-abortable-preclean-start]
7688.465: [GC 7688.465: [ParNew: 1040940K->1464K(1044544K), 0.0165840 secs] 1343593K->304365K(2093120K), 0.0167509 secs]
7690.093: [CMS-concurrent-abortable-preclean: 1.012/1.907 secs]
7690.095: [GC[YG occupancy: 522484 K (1044544 K)]7690.095: [Rescan (parallel) , 0.3665541 secs]7690.462: [weak refs processing, 0.0003850 secs] [1 CMS-remark: 302901K(1048576K)] 825385K(2093120K), 0.3670690 secs]

In the above log, after a preclean, 'abortable preclean' starts. After the young generation collection, the young gen occupancy drops down from 1040940K to 1464K. When young gen occupancy reaches 522484K which is 50% of the total capacity, precleaning is aborted and 'remark' phase is started.

Note that in 1.5, young generation occupancy also gets printed in the final remark phase.

For more detailed information and tips on GC tuning, please refer to the following documents:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
http://java.sun.com/docs/hotspot/gc1.4.2/

分享到:
评论

相关推荐

    深入java虚拟机光盘源码-jvm-gc-logs-analyzer:jvm-gc-logs-analyzer

    深入java虚拟机光盘资源jvm-gc-logs-analyzer 这个项目是一个 Java 虚拟机和垃圾收集器日志分析器。 它专用于 JVM 11 及更高版本(JVM 8 支持正在开发中)。 日志必须采用适当的格式和适当的装饰器,检查最后部分的...

    darks-logs 1.0.7

    【标题】"darks-logs 1.0.7" 是一个特定版本的软件日志管理框架,专门设计用于处理和记录应用中的日志信息。这个版本为1.0.7,意味着它可能包含了之前版本的改进和修复,提供更稳定、更高效的服务。 【描述】"darks...

    nacos-server v2.4.0 镜像

    可以直接用如下配置在docker-compose里启动: nacos: image: infras/nacos-server:v2.4.0 container_name: nacos ... - ./storage/logs/nacos/gclogs:/data/nacos/gclogs environment: - TZ=Asia/Shanghai

    logs.pcapng解析.docx

    今天,我们将使用 Wireshark 分析 logs.pcapng 数据包文件,探索恶意用户的活动痕迹。 一、恶意用户目录扫描 在数据包文件 logs.pcapng 中,我们可以使用 Wireshark 查看恶意用户的目录扫描活动。通过使用过滤器 ...

    Unity-Logs-Viewer-master.zip

    Unity-Logs-Viewer-master.zip 是一个专门为Unity开发者设计的压缩包,其中包含了一个插件,用于在不依赖ADB(Android Debug Bridge)的情况下查看Unity在真机设备上的运行日志。这个插件对于开发者来说非常实用,...

    smart-logs_日志框架_burstow5_

    《智能日志框架smart-logs_burstow5详解》 在现代软件开发中,日志框架扮演着至关重要的角色,它记录程序运行过程中的各种信息,帮助开发者追踪问题,优化性能,以及进行故障排查。本文将详细介绍名为"smart-logs_...

    game_logs.csv数据集

    游戏日志数据集"game_logs.csv"是IT领域中用于数据分析和挖掘的一种常见资源,尤其在游戏行业,这种数据集非常有价值。它记录了玩家在游戏中的各种活动和行为,可以用于理解玩家行为模式,优化游戏设计,提高用户...

    host_driver_logs_current.txt

    host_driver_logs_current.txt

    logs.js

    logs.js

    Unity-Logs-Viewer-master.rar

    Unity-Logs-Viewer-master 是一个专门为Unity游戏开发者设计的工具,旨在简化真机调试过程,尤其是在iOS和Android设备上。这个工具允许开发者在游戏运行时实时查看Debug日志,极大地提高了开发效率和问题排查能力。 ...

    Apache.Logs.Viewer.v.5.39.Patch-URET.zip

    Apache Logs Viewer是一款专门用于分析Apache服务器日志的实用工具,版本号为5.39,本次更新包含了 Patch-URET 的修复和改进。这个软件能够帮助IT管理员和开发者有效地理解和解析Apache服务器生成的日志文件,从中...

    魅思CMS10开源版-ys009模板-【YM源码】.zip

    - **logs**:日志文件,记录系统的运行情况和错误信息。 电影网站通常需要具备的功能可能有: - 视频上传和管理:用户可以上传、编辑和删除视频,后台需要有视频处理能力,如转码、缩略图生成等。 - 分类和标签:...

    logs2intrusions

    "logs2intrusions" 是一个专门用于Web日志入侵检测的工具,它的核心功能是通过对Web服务器的日志数据进行分析,识别出潜在的入侵行为或安全威胁。在网络安全领域,这种工具至关重要,因为它们能够帮助管理员及时发现...

    logs.csv(4).xlsx

    logs.csv(4).xlsx

    Unity日志输出 Unity-Logs-Viewer

    Unity日志输出插件,在手机和pc上均有用,能很清晰的看到日志打印,非常好用。 使用这个工具,你可以很容易地在游戏内部检查你的编辑器控制台日志!在移动端同样有效! 支持unity2017.4.29 or 更高版本

    删除tomcat下logs文件的批处理工具

    删除tomcat下产生的日志文件,配合计划任务使用,会更加有效果呢.

    阿射日志系统logs 1.0.rar

    阿射日志系统logs基于PHP MySQL平台开发,结构简洁,运行速度快,简体中文UTF-8编码。 安装方法: 1.将文件夹下所有的文件上传。 2.通过浏览器访问 ,填写配置信息进行安装。 3.安装完成,访问首页。 4.管理...

Global site tag (gtag.js) - Google Analytics