GC 调优 - 防止 Full GC

2024-01-11

我试图避免 Full GC(来自下面的 gc.log 示例) 在生产中的 Tomcat 中运行 Grails 应用程序。 关于如何更好地配置 GC 有什么建议吗?

14359.317:[完整 GC 14359.317:[CMS:3453285K->3099828K(4194304K),13.1778420 秒] 4506618K->3099828K(6081792K),[CMS 权限:261951K->18 1304K(264372K)] icms_dc=0 , 13.1786310 秒] [次:用户=13.15系统=0.04,真实=13.18秒]

我的虚拟机参数如下:
-Xms=6G
-Xmx=6G
-XX:MaxPermSize=1G
-XX:新大小=2G
-XX:最大TenuringThreshold=8
-XX:幸存者比率=7
-XX:+使用ConcMarkSweepGC
-XX:+CMSClassUnloading启用
-XX:+CMSPermGenSweepingEnabled
-XX:+CMS增量模式
-XX:CMSInitiatingOccupancyFraction=60
-XX:+使用CMSInitiatingOccupancyOnly
-XX:+HeapDumpOnOutOfMemoryError
-XX:+打印GC详细信息
-XX:+PrintGC时间戳
-XX:+PrintTenuringDistribution
-Dsun.reflect.inflationThreshold=0



    14169.764: [GC 14169.764: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   15584312 bytes,   15584312 total
    - age   2:   20053704 bytes,   35638016 total
    - age   3:   13624872 bytes,   49262888 total
    - age   4:   14469608 bytes,   63732496 total
    - age   5:   10553288 bytes,   74285784 total
    - age   6:   11797648 bytes,   86083432 total
    - age   7:   12591328 bytes,   98674760 total
    : 1826161K->130133K(1887488K), 0.1726640 secs] 5216326K->3537160K(6081792K) icms_dc=0 , 0.1733010 secs] [Times: user=0.66 sys=0.03, real=0.17 secs] 
    14218.712: [GC 14218.712: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   25898512 bytes,   25898512 total
    - age   2:   10308160 bytes,   36206672 total
    - age   3:   16927792 bytes,   53134464 total
    - age   4:   13493608 bytes,   66628072 total
    - age   5:   14301832 bytes,   80929904 total
    - age   6:   10448408 bytes,   91378312 total
    - age   7:   11724056 bytes,  103102368 total
    - age   8:   12299528 bytes,  115401896 total
    : 1807957K->147911K(1887488K), 0.1664510 secs] 5214984K->3554938K(6081792K) icms_dc=0 , 0.1671290 secs] [Times: user=0.61 sys=0.00, real=0.17 secs] 
    14251.429: [GC 14251.430: [ParNew
    Desired survivor size 107347968 bytes, new threshold 7 (max 8)
    - age   1:   25749296 bytes,   25749296 total
    - age   2:   20111888 bytes,   45861184 total
    - age   3:    7580776 bytes,   53441960 total
    - age   4:   16819072 bytes,   70261032 total
    - age   5:   13209968 bytes,   83471000 total
    - age   6:   14088856 bytes,   97559856 total
    - age   7:   10371160 bytes,  107931016 total
    - age   8:   11426712 bytes,  119357728 total
    : 1825735K->155304K(1887488K), 0.1888880 secs] 5232762K->3574222K(6081792K) icms_dc=0 , 0.1895340 secs] [Times: user=0.74 sys=0.06, real=0.19 secs] 
    14291.342: [GC 14291.343: [ParNew
    Desired survivor size 107347968 bytes, new threshold 7 (max 8)
    - age   1:   25786480 bytes,   25786480 total
    - age   2:   21991848 bytes,   47778328 total
    - age   3:   16650000 bytes,   64428328 total
    - age   4:    7387368 bytes,   71815696 total
    - age   5:   16777584 bytes,   88593280 total
    - age   6:   13098856 bytes,  101692136 total
    - age   7:   14029704 bytes,  115721840 total
    : 1833128K->151603K(1887488K), 0.1941170 secs] 5252046K->3591384K(6081792K) icms_dc=0 , 0.1947390 secs] [Times: user=0.82 sys=0.04, real=0.20 secs] 
    14334.142: [GC 14334.143: [ParNew
    Desired survivor size 107347968 bytes, new threshold 6 (max 8)
    - age   1:   31541800 bytes,   31541800 total
    - age   2:   20826888 bytes,   52368688 total
    - age   3:   19155264 bytes,   71523952 total
    - age   4:   16422240 bytes,   87946192 total
    - age   5:    7235616 bytes,   95181808 total
    - age   6:   16549000 bytes,  111730808 total
    - age   7:   13026064 bytes,  124756872 total
    : 1829427K->167467K(1887488K), 0.1890190 secs] 5269208K->3620753K(6081792K) icms_dc=0 , 0.1896630 secs] [Times: user=0.80 sys=0.03, real=0.19 secs] 
    14359.317: [Full GC 14359.317: [CMS: 3453285K->3099828K(4194304K), 13.1778420 secs] 4506618K->3099828K(6081792K), [CMS Perm : 261951K->181304K(264372K)] icms_dc=0 , 13.1786310 secs] [Times: user=13.15 sys=0.04, real=13.18 secs]
    14373.287: [GC [1 CMS-initial-mark: 3099828K(4194304K)] 3100094K(6081792K), 0.0107380 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
    14373.298: [CMS-concurrent-mark-start]
    14472.579: [GC 14472.579: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   42849392 bytes,   42849392 total
    : 1677824K->86719K(1887488K), 0.1056680 secs] 4777652K->3186547K(6081792K) icms_dc=0 , 0.1063280 secs] [Times: user=0.61 sys=0.00, real=0.11 secs] 
    14506.980: [GC 14506.980: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   42002904 bytes,   42002904 total
    - age   2:   35733928 bytes,   77736832 total
    : 1764543K->96136K(1887488K), 0.0982790 secs] 4864371K->3195964K(6081792K) icms_dc=0 , 0.0988960 secs] [Times: user=0.53 sys=0.01, real=0.10 secs] 
    14544.285: [GC 14544.286: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   26159736 bytes,   26159736 total
    - age   2:   37842840 bytes,   64002576 total
    - age   3:   33192784 bytes,   97195360 total
    : 1773960K->130799K(1887488K), 0.1208590 secs] 4873788K->3230628K(6081792K) icms_dc=0 , 0.1215900 secs] [Times: user=0.59 sys=0.02, real=0.13 secs] 
    14589.266: [GC 14589.266: [ParNew
    Desired survivor size 107347968 bytes, new threshold 4 (max 8)
    - age   1:   28010360 bytes,   28010360 total
    - age   2:   21136704 bytes,   49147064 total
    - age   3:   35081376 bytes,   84228440 total
    - age   4:   32468056 bytes,  116696496 total
    : 1808623K->148284K(1887488K), 0.1423150 secs] 4908452K->3248112K(6081792K) icms_dc=0 , 0.1429440 secs] [Times: user=0.70 sys=0.02, real=0.14 secs] 
    14630.947: [GC 14630.947: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   28248240 bytes,   28248240 total
    - age   2:   20712320 bytes,   48960560 total
    - age   3:   18217168 bytes,   67177728 total
    - age   4:   34834832 bytes,  102012560 total
    : 1826108K->140347K(1887488K), 0.1784680 secs] 4925936K->3275469K(6081792K) icms_dc=0 , 0.1790920 secs] [Times: user=0.98 sys=0.03, real=0.18 secs] 
    14664.779: [GC 14664.779: [ParNew
    Desired survivor size 107347968 bytes, new threshold 5 (max 8)
    - age   1:   25841000 bytes,   25841000 total
    - age   2:   22264960 bytes,   48105960 total
    - age   3:   17730104 bytes,   65836064 total
    - age   4:   17988048 bytes,   83824112 total
    - age   5:   34739384 bytes,  118563496 total
    : 1818171K->147603K(1887488K), 0.1714160 secs] 4953293K->3282725K(6081792K) icms_dc=0 , 0.1720530 secs] [Times: user=0.82 sys=0.11, real=0.17 secs] 
    14702.488: [GC 14702.489: [ParNew
    Desired survivor size 107347968 bytes, new threshold 8 (max 8)
    - age   1:   26887368 bytes,   26887368 total
    - age   2:   21403352 bytes,   48290720 total
    - age   3:   18732224 bytes,   67022944 total
    - age   4:   17640576 bytes,   84663520 total
    - age   5:   17942952 bytes,  102606472 total
    : 1825427K->142695K(1887488K), 0.2118320 secs] 4960549K->3312168K(6081792K) icms_dc=0 , 0.2124630 secs] [Times: user=1.13 sys=0.14, real=0.21 secs] 
  

我的目标策略是: 我想将获得终身任职的内容限制在最低限度,我正在服务请求,并期望除了一定数量的共享对象之外,所有其他对象仅对手头的请求有用。因此,通过使用较大的 NewSize 和增加的 TenuringThreshold,希望这些单一服务对象不会残留。

以下内容支持我的策略:
-Xms=6G
-Xmx=6G
-XX:NewSize=2G // 足够大的空间,这样ParNew就不会经常发生,让对象有时间过期
-XX:MaxTenuringThreshold=8 // 进一步限制任期
-XX:SurvivorRatio=7 // 基于示例 -XX:CMSInitiatingOccupancyFraction=60
// 防止升级分配失败导致的Full GC
-XX:+使用CMSInitiatingOccupancyOnly
// 与上面的示例一致

MaxPermSize=1G 和“-Dsun.reflect.inflationThreshold=0”与另一个我宁愿分开的问题有关。

“-XX:+CMSClassUnloadingEnabled”和“-XX:+CMSPermGenSweepingEnabled”之所以存在,是因为 grails 严重依赖额外的类来进行闭包和反射

-XX:+CMSIncrementalMode 是一个实验,但没有取得太大成功


发布的日志片段显示您有大量对象的存活时间超过 320 秒(每个年轻集合大约有 40 秒,并且对象在升级之前经过 8 个集合的存活)。然后剩下的对象就会变成终身对象,最终你会遇到一个明显意想不到的完整GC,它实际上并没有收集太多东西。

3453285K->3099828K(4194304K)

即,您有一个 4G 终身网络,在触发时约占 82% (3453285/4194304),并在 13 秒后约占 74%。

这意味着花费了 13 秒来收集总计约 350M 的数据,这对于 6G 堆来说并不算多。

这基本上意味着你的堆不够大,或者更有可能的是,你有内存泄漏。像这样的泄漏对于 CMS 来说是一件可怕的事情,因为并发的 tenured 集合是一个非压缩事件,这意味着 tenured 是一个空闲列表的集合,这意味着碎片对于 CMS 来说可能是一个大问题,这意味着您对 tenured 的利用变得越来越低效。意味着升级失败事件的可能性增加(尽管如果这是这样一个事件,那么我希望看到一条日志消息说明这一点),因为它想要升级(或认为需要升级)X MB 为终身职位但它没有可用的(连续)空闲列表 >= X MB。这会触发意外的永久收集,这是一个非远程并发的 STW 事件。如果你实际上没有什么可收集的(正如你所做的那样),那么你坐在那里无所事事也就不足为奇了。

一些一般性的指示,在很大程度上重申了弗拉基米尔·西特尼托夫所说的话......

  • 在多核机器上使用 iCMS 没有任何意义(除非您有lotsJVM 或在该机器上运行的其他进程的数量,导致 JVM 确实缺乏 CPU),因此删除此开关
  • your young collections are unnecessarily long because of the impact of copying relatively substantial quantities of memory between the survivor spaces on every collection, 150-200ms is a really quite massive ParNew collection
    • 年轻一代问题的正确答案取决于分配行为的真正含义(例如,也许您最好尽早保留并减少碎片对永久集合的影响,或者也许您最好拥有更大规模的新集合) gen 并减少年轻代收集的频率,从而减少提升的对象,从而最大限度地减少终身的流失)。

一些问题...

  • 它最终会发生 OoM 还是会恢复?
  • 在此日志片段期间,应用程序是否处于稳定状态(在启动后的某个时刻承受一致的负载)还是处于压力之下?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GC 调优 - 防止 Full GC 的相关文章

  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http

随机推荐

  • 流星 0.9.x 更新

    如何找出导致我的应用程序无法更新的原因 我不断收到 该项目是最新版本 与您当前的包限制兼容 信息 以下是更新命令的输出 Refreshing package metadata This may take a moment Figuring
  • 资产文件夹的绝对路径

    如何引用手机内存中的资源 我需要它将绝对路径写入 html 文件以加载资源文件夹中的一些图像 这个html保存在手机内存中 但我无法将这些图像保存在手机内存中 因为它们非常大 file android asset where 是你里面的东西
  • uiscrollview 不会取消 uisegmentedcontrol 的内容触摸

    我已经对 UIScrollView 进行了子类化 并按以下方式重写了 TouchesShouldCancelInContentView 方法 BOOL touchesShouldCancelInContentView UIView view
  • 如何在 Visual Studio 2010 中进行 Profiler 单元测试?

    我可以使用 VS 2010 Profiler 来分析单元测试 MSTest 吗 如果是 怎么办 谢谢 迈克尔 如果打开 测试视图 窗口 您可以右键单击要分析的测试 然后选择 创建性能会话
  • primefaces tabView activeIndex 问题

    我有 Primefaces TabView 和两个选项卡 例如
  • 从 json 字符串中提取信息并将其添加到 C# 中的列表中

    我是 json 新手 我想要不同用户的信息并将它们添加到数据网格视图 or 数据表 or dataSet在 C net 开发 中 信息样本为 json有效 JrPwbApfIHbQhCUmVIoiVJcPYv93 address Jesso
  • 如何在 RStudio 查看器窗格中显示 PNG 文件?

    如果我有 PNG 文件 是否有一种简单的方法可以在 RStudio 查看器窗格中显示它 使用这个答案https stackoverflow com a 9319351 2554330 https stackoverflow com a 93
  • 在vim中显示函数参数

    vim 有没有办法获得带有函数参数的弹出窗口 就像在视觉工作室 光滑编辑中一样 例如当我输入 function name 时 vim会打开一个弹出窗口 就像做时一样 ctrl n在新版本中 并向我显示函数参数以及我当前正在输入的其中之一 p
  • 获取视频的当前时间(播放器 - Swift)

    我使用设置了一个视频播放器Player https github com piemonte Player 使用 AVFoundation 我正在尝试访问和操作视频的当前时间 但是 该库仅提供视频的持续时间 而不提供当前时间 我正在调整Pla
  • 如何将 kubernetes 事件从 GKE 集群传播到谷歌云日志

    有没有办法将所有 kubernetes 事件传播到 google 云日志 例如 Pod 创建 删除或活动探测失败 我知道我可以在控制台中使用 kubectl get events 但是 我想将这些事件与其他 Pod 级别日志一起保留在云日志
  • 将 SNS 消息发布到 HTTPS Api 网关端点以触发 Lambda 函数

    我想从 Account1 region1 触发 Account2 region2 中的 Lambda 函数 因此 我使用订阅 HTTPS API 网关端点 POST 方法 的 SNS 主题 这将触发 Lambda 问题是我不知道如何抓取到达
  • 单击更改谷歌地图多边形颜色/填充

    我有以下代码已传递给我并创建多边形
  • 在 Eclipse 中,模块路径和类路径有什么区别?

    在Eclipse中 模块路径和类路径有什么区别 我应该使用哪一个来添加JAR文件lib folder 为什么JRE系统库会出现在模块路径中 模块体系对代码主要有以下影响 一个包只能从一个模块访问 嵌套包被视为单独的 所以即使包java ut
  • 单击 ng-repeat 表中的 。量角器E2E-测试角度

    我有这张桌子 table class table thead tr th class col sm 5 Actions th th class col sm 5 Title th th class col sm 2 Saved th tr
  • 编写键值存储

    我希望编写一个键 值存储 可能用Python 主要只是为了体验 因为我认为这是一个非常有用的产品 我有一些问题 一般来说 键 值对通常如何存储在内存和磁盘上 如何将存储在磁盘上的内容加载回内存 键 值存储是否同时将所有键 值对保存在内存中
  • 了解 PHP 中的输入转义

    一直让我困惑的一件事是输入转义以及是否受到保护以免受 SQL 注入等攻击 假设我有一个表单 它使用 HTTP POST 将数据发送到 PHP 文件 我在输入字段中输入以下内容并提交表单 Hello said Jimmy O Toole 如果
  • 通过 KeyChain 保存和检索值

    我正在尝试存储一个整数并使用 KeyChain 检索它 这就是我保存它的方式 func SaveNumberOfImagesTaken let key IMAGE TAKEN var taken 10 let data NSKeyedArc
  • AngularJS md-tabs 的更改索引根本没有效果

    在我的 Angular 应用程序中 我有一个 md tabs 其 md selected 指令绑定到我的控制器中的属性 我想将当前选项卡更改为索引由 ng click 模板中其他位置调用的函数设置的选项卡 我是这样做的 div div
  • 使用 Retrofit 2 从响应 JSON 获取单个 JSON 属性值

    我正在使用 Retrofit 库 撰写本文时版本为 2 0 2 我正在对一项响应大型 JSON 对象的服务进行 GET 调用 但我只对其中的一个键 值对感兴趣 我怎样才能得到这个而不是编写一个与 JSON 响应匹配的全新 POJO 类 例子
  • GC 调优 - 防止 Full GC

    我试图避免 Full GC 来自下面的 gc log 示例 在生产中的 Tomcat 中运行 Grails 应用程序 关于如何更好地配置 GC 有什么建议吗 14359 317 完整 GC 14359 317 CMS 3453285K gt