GC问题

GC报错Full GC (System.gc())的手动触发问题 Full GC (System.gc())的手动触发在Java应用中可能导致性能问题和不可预测的垃圾回收行为。System.gc()仅建议JVM进行垃圾回收,但无法保证执行,且频繁调用可能引发性能下降。为避免这些问题,应避免手动调用System.gc(),并通过JVM参数如-XX:+DisableExplicitGC禁用显式GC。此外,优化JVM参数、选择合适的垃圾回收器(如G1、ZGC)以及使用监控工具(如jstat、VisualVM)进行内存和GC行为分析,都是有效的解决方案。通过这些措施,可以提升应用 阅读详情

一次线上GC故障解决过程记录 

原

    排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助。本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章:

    http://my.oschina.net/feichexia/blog/196575


背景说明

    发生问题的系统部署在Unix上,发生问题前已经跑了两周多了。

    其中我用到了Hadoop源码中的CountingBloomFilter,并将其修改成了线程安全的实现(详情见:AdjustedCountingBloomFilter),主要利用了AtomicLong的CAS乐观锁,将long[]替换成了AtomicLong[]。这样导致系统中有5个巨大的AtomicLong数组(每个数组大概占50MB),每个数组包含大量AtomicLong对象(所有AtomicLong对象占据大概1.2G内存)。而且这些AtomicLong数组的存活时间都至少为一天。

    服务端已先于手机客户端上线,客户端本来计划本周四上线(写这篇文章时是周一),所以我还打算在接下来的几天继续观察下系统的运行状况,开启的仍然是Debug级别日志。

    部分JVM参数摘抄如下(JVM参数配置在项目部署的tomcat服务器的根目录下的bin目录下的setenv.sh中,可以通过ps -ef | grep xxx | grep -v grep查看到):

-XX:PermSize=256M -XX:MaxPermSize=256M -Xms6000M -Xmx6000M -Xmn1500M -Xss256k -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSScavengeBeforeRemark -XX:+HeapDumpOnOutOfMemoryError -Xloggc:/usr/local/webserver/point/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

    可以看到持久代被设置为256M,堆内存被设置为6000M(-Xms和--Xmx设为相等避免了“堆震荡”,能在一定程度减少GC次数,但会增加平均每次GC消耗的时间),年轻代被设置为1500M。

    -XX:+UseConcMarkSweepGC设置老年代使用CMS(Concurrent Mark-Sweep)收集器。 -XX:+UseParNewGC设置新生代使用并行收集器,-XX:ParallelGCThreads参数指定并行收集器工作线程数,在CPU核数小于等于8时一般推荐与CPU数目一致,但当CPU核数大于8时推荐设置为:3 + [(5*CPU_COUNT) / 8]。其他参数略去不提。


问题发现与解决过程

    早上测试找到我说线上系统突然挂了,报访问超时异常。

    首先我第一反应是系统内存溢出或者进程被操作系统杀死了。用ps -ef | grep xxx | grep -v grep命令查看进程还在。然后看tomcat的catlalina.out日志和系统gc日志,也未发现有内存溢出。

    接下来用jstat -gcutil pid 1000看了下堆中各代的占用情况和GC情况,发现了一个挺恐怖的现象:Eden区占用77%多,S0占用100%,Old和Perm区都有很大空间剩余。

    怀疑是新生代空间不足,但没有确凿证据,只好用jstack获取线程Dump信息,不看不知道,一看就发现了一个问题(没有发现线程死锁,这里应该是“活锁”问题):

    从上面第一段可看到有一个Low Memory Detector系统内部线程(JVM启动的监测和报告低内存的守护线程)一直占着锁0x00....00,而下面的C2 CompilerThread1、C2 CompilerThread0、Signal Dispatcher和Surrogate Locker线程都在等待这个锁,导致整个JVM进程都hang住了。

    在网上搜索一圈,发现大部分都建议调大堆内存,于是根据建议打算调大整个堆内存大小、调大新生代大小(-Xmn参数)、调大新生代中Survivor区占的比例(-XX:SurvivorRatio参数)。并且由于存在AtomicLong数组大对象,所以设置-XX:PretenureThreshold=10000000,即如果某个对象超过10M(单位为字节,所以换算后为10M)则直接进入老年代,注意这个参数只在Serial收集器和ParNew收集器中有效。另外希望大量的长生命周期AtomicLong小对象能够尽快进入老年代,避免老年代的AtomicLong数组对象大量引用新生代的AtomicLong对象,我调小了-XX:MaxTenuringThreshold(这个参数的默认值为15),即现在年轻代中的对象至多能在年轻代中存活8代,如果超过8代还活着,即使那时年轻代内存足够也会被Promote到老年代。有修改或增加的JVM GC参数如下:

-Xms9000M -Xmx9000M -Xmn1500M -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=8 -XX:PretenureSizeThreshold=10000000

    重启系统后用jstat -gcutil pid 1000命令发现一个更恐怖的现象,如下图:Eden区内存持续快速增长,Survivor占用依然很高,大概每两分钟就Young GC一次,并且每次Young GC后年老代内存占用都会增加不少,这样导致可以预测每三四个小时就会发生一次Full GC,这是很不合理的。

    第二列是S1,占用高达87.45%,第三列是Eden区内存占用变化情况,可以看到增长非常快。

    于是我用jmap -histo:live(注意jmap命令会触发Full GC,并发访问量较大的线上环境慎用)查看了下活对象,发现有一些Integer数组和一些Character数组占用内存在持续增长,并且占了大概好几百M的内存,然后经过Young GC又下降,然后再次快速增长,再Young GC下降,周而复始。 

    至此,我推测可能是大量的Integer数组对象和Character数组对象基本占满了Survivor,导致在Eden满了之后,新产生的Integer数组对象和Character数组对象不足以放入Survivor,然后对象被直接被Promote到了年老代,这种推测部分正确,它解释了S1占用那么高的原因,但不能解释上面的Eden区内存占用持续上升。

    于是继续查看了下接口调用日志,不看不知道,一看吓一跳:日志刷新非常之快(99%是DEBUG日志)。原来运营和测试在未通知我们服务端的情况下已经于昨天在某个渠道发布了一个Android线上版本(难怪今天就暴露问题了),再看了下使用该系统的用户已经有6400多个了,彻彻底底被他们坑了一把。这就能解释为什么上面有一个Integer数组和Character数组占用内存持续增长了,原因就在于大量的系统接口调用触发了大量DEBUG日志刷新,写日志对于线上系统是一个重量级操作,无论是对CPU占用还是对内存占用,所以高并发线上系统一定要记得调高日志级别为INFO甚至ERROR。

    于是修改log4j.properties中的日志级别为INFO,然后用jmap -histo:live pid命令查看活对象,发现Integer数组对象和Character[]数组对象明显下降,并且占用内存也由前面的几百M降到几M。

    之后再用jstat -gcutil pid 1000查看了下GC情况,如下:

    很明显Survivor占用没这么高了,最重要的Young GC后年老代内存占用不会增加了,此处Eden区增长貌似还是挺快,因为此时用户数比前面多了很多。至此出现的问题基本搞定,但还有待后续观察。


总结

    总的来说本系统中存在一个违背GC假设的东西,那就是在JVM堆中存在着海量生命周期较长的小对象(AtomicLong对象)。这无疑会给系统埋坑。

    GC分代基本假设是:

JVM堆中存在的大部分对象都是短生命周期小对象。

    这也是为什么Hotspot JVM的年轻代采用复制算法的原因。


    其他推荐一些非常不错的GC方面的参考文章(前两篇都来自《深入理解Java虚拟机》一书,参考链接大部分是我今天查阅的资料,大家选择性看就好):

    JVM内存管理:深入Java内存区域与OOM http://www.iteye.com/topic/802573

    JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638

    Oracle GC Tuning http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

    Java 6 JVM参数选项大全 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm

    Java HotSpot VM Options http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

    CMS GC实践总结 http://www.iteye.com/topic/473874

    JVM内存的分配及回收 http://blog.youkuaiyun.com/eric_sunah/article/details/7893310

    一步一步优化JVM系列 http://blog.youkuaiyun.com/zhoutao198712/article/category/1194642

    Java线程Dump分析 http://www.linuxidc.com/Linux/2009-01/18171.htm http://jameswxx.iteye.com/blog/1041173

    利用Java Dump进行JVM故障诊断 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/

    Detecting Low Memory in Java https://techblug.wordpress.com/2011/07/16/detecting-low-memory-in-java/

    Detecting Low Memory in Java Part 2 http://techblug.wordpress.com/2011/07/21/detecting-low-memory-in-java-part-2/

    http://blog.sina.com.cn/s/blog_56d8ea9001014de3.html

    http://stackoverflow.com/questions/2101518/difference-between-xxuseparallelgc-and-xxuseparnewgc

    http://stackoverflow.com/questions/220388/java-concurrent-and-parallel-gc

    http://j2eedebug.blogspot.com/2008/12/what-to-look-for-in-java-thread-dumps.html

    https://devcenter.heroku.com/articles/java-memory-issues

    http://blog.youkuaiyun.com/sun7545526/article/category/1193563

    http://java.dzone.com/articles/how-tame-java-gc-pauses


© 著作权归作者所有

优雅先生
粉丝 354
 
博文 34
 
码字总数 46290
 
作品 0
 浦东
 
 技术主管

评论(2)

优雅先生
优雅先生 
引用来自“木木三”的评论
我想问一个最后一张图,第6列YGC=4,第8列FGC=9,FGC比YGC次数多,这种现象正常么
其实这个问题还没有解决,后来又出现了,根本原因在于我改写的一个CountingBloomFilter中用到了AtomicLong[],海量的AtomicLong小对象瞬间产生,年轻代放不下直接Promote到老年代导致promotion failed,后来改成AtomicLongArray才解决问题。
木木三
木木三 
我想问一个最后一张图,第6列YGC=4,第8列FGC=9,FGC比YGC次数多,这种现象正常么
JVM理论-调优-故障分析

深入理解JVM类文件格式 我们知道Java最有名的宣传口号就是:“一次编写,到处运行(Write Once,Run Anywhere)”,而其平台无关性则是依赖于JVM, 所有的java文件都被编译成字节码(class)...

掘金官方 ⋅ 2017/12/27 ⋅  0

PHP 性能跟踪监控系统--Fiery

Fiery 是一款为PHP提供服务的性能跟踪监控系统,可以方便的查看线上调用关系,响应性能,回放请求过程,参数,系统异常、性能统计,部署简单方便,所有服务都集成在一个jar包内,除Java Runt...

徐长龙 ⋅ 2017/05/22 ⋅  1

阿里移动|《蚂蚁金服移动端高可用技术实践》

摘要:对于移动技术而言,2017年是继往开来之年。一方面是移动技术领域进入深水区,另一方面移动技术边界和内涵被不断重塑。阿里巴巴希望进一步推动移动应用研发事实标准落地,从而赋能整个行...

阿里云云栖社区 ⋅ 2017/12/08 ⋅  0

蚂蚁金服移动端高可用技术实践

摘要:对于移动技术而言,2017年是继往开来之年。一方面是移动技术领域进入深水区,另一方面移动技术边界和内涵被不断重塑。阿里巴巴希望进一步推动移动应用研发事实标准落地,从而赋能整个行...

阿里云云栖社区 ⋅ 2017/12/08 ⋅  0

程序员应该知道的“分布式链路追踪”

微信公众号:程序员大会 随着去中⼼化思想的流行,越来越多的系统正在从大规模整体式架构向着分布式微服务架构迁移,服务之间的相互调⽤⽇益复杂。如何保证系统的可观测性,快速发现系统性能瓶颈...

程序员大会 ⋅ 01/12 ⋅  0

如何深入Python虚拟机追查HTTP服务core dump导致502的问题

目前大部分 Python 的 HTTP 服务都是用 uWSGI 托管 Python 多进程的 Django 或者 Flask 框架的 App。而多进程模型就会有进程间通信的问题,对此 uWSGI 提供了 spooler 功能用于让不同 worker...

python达人 ⋅ 01/06 ⋅  0

如何深入 Python 虚拟机追查 HTTP 服务 core dump 导致 502 的问题

  作者 | 今日头条技术团队   概述   今日头条目前大部分 Python 的 HTTP 服务都是用 uWSGI 托管 Python 多进程的 Django 或者 Flask 框架的 App。而多进程模型就会有进程间通信的问题...

优快云 ⋅ 01/05 ⋅  0

如何避免后台IO高负载造成的长时间JVM GC停顿

译者注:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下。 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是Linkedin的一名S...

重度恐高症 ⋅ 2016/02/20 ⋅  0

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配、GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为时分配外, 我们着重...

hanqing280441589 ⋅ 2016/12/30 ⋅  0

堆外内存初探

使用Java语言的同学们都知道, Java的虚拟机对内存的管理大部分情况下就是指堆内存的管理, GC的也是对堆内存的清理和回收.下面就看一下堆外内存的对JVM的意义. 第一次了解到堆外内存的使用场景...

boomya ⋅ 2016/07/01 ⋅  0

加载更多

先别急着怪GC:Java GC问题的性能标尺、触发原因解码与根因判定解析 接口毛刺出现时,GC常被第一个怀疑,却未必是元凶。本文先用单次停顿不超过TP9999、GC吞吐不低于99.99%两条约束,把SLA换算成每分钟6毫秒的停顿预算;再对照JDK 8到25的HotSpot源码解读GCCause,并在JDK 8上实测13种触发场景,发现禁用显式GC会连带屏蔽jcmd GC.run,JNI临界区可引发462次Full GC;又用一小时仿真比较时序、概率、实验、反证四种判因方法,揭示混杂与时长偏倚陷阱;最后按Mutator类型、九类问题和排查难度给出定位思路与适用范围。 阅读详情

相关推荐

嵌入式存储入门:Emmc控制器与设备工作原理全解析(附Synopsys/Arasan架构图)

本文深入解析了嵌入式系统中Emmc控制器与设备的工作原理,重点剖析了其作为CPU与存储设备桥梁的核心架构。通过对比Synopsys和Arasan两家主流IP厂商的控制器设计,详细阐述了DMA引擎与FIFO缓冲模块如何协同工作以提升数据传输效率,并提供了从硬件PCB布局到驱动调试的实战指南,帮助硬件工程师与开发者优化系统性能。

weixin_29248653的博客 149

连接跟踪超时与提早回收

连接跟踪回收使用work完成,如下函数进行初始化,运行时间间隔设置为1秒钟(HZ)。回收函数gc_worker每次最多扫描所有hash桶总数量的GC_MAX_BUCKETS_DIV分之一(即1/128),使用变量last_bucket记录上一次扫描结束时的哈希桶索引,如果此值已大于hash桶的总数量,复位为0,从新开始。如果early_drop未开启,不执行回收。或者,early_drop开启,但是连接跟踪数量小于总数的95%,也不执行回收。...

redwingz的博客 1225

uniapp运行钉钉小程序

因项目原因,公司需要在钉钉里面开发小程序。之前用uniapp开发过app,H5,小程序。还真没尝试过钉钉小程序,今天就简单的记录下uniapp运行钉钉小程序中的过程。

YL 2919

一次线上GC故障解决过程记录

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860147的博客 2390

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1186

c++ 多线程 垃圾回收器_垃圾回收器 G1 详解

为什么要学G1G1(Garbadge First Collector)作为一款JVM最新的垃圾收集器,可以解决CMS中Concurrent Mode Failed问题,尽量缩短处理超大堆的停顿,在G1进行垃圾回收的时候完成内存压缩,降低内存碎片的生成。G1在堆内存比较大的时候表现出比较高吞吐量和短暂的停顿时间,而且已成为Java 9的默认收集器。未来替代CMS只是时间的问题。G1的GC原理Regi...

weixin_39943547的博客 1161

JA4 TLS指纹:反爬攻防下沉至网络层的实战指南

TLS指纹是识别客户端网络栈特征的基础安全概念,其原理源于对TLS 1.3/1.2握手阶段Client Hello明文字段的结构化提取与哈希编码。相比依赖JavaScript执行环境的传统浏览器指纹,TLS指纹具备更高稳定性与更低伪造性,技术价值在于绕过前端混淆、直击爬虫底层网络协议栈。典型应用场景包括电商风控、金融反欺诈及招聘平台数据防护,尤其适用于对抗高仿真无头浏览器与通用HTTP库爬虫。本文聚焦JA4这一工业级TLS指纹标准,深入解析其字段逻辑、Nginx原生集成方案及与JA4S/JA4X的纵深协同机

weixin_33675507的博客 866

spark源码阅读-存储体系6(内存存储MemoryStore)

MemoryStore负责将Block存储到内存。Spark通过将广播数据、RDD、Shuffle数据存储到内存,减少了对磁盘I/O的依赖,提高了程序的读写效率。MemoryStore依赖于MemoryManager的服务。 一、MemoryStore的内存模型 Block再内存中是以什么形式存在呢?Spark将内存中的Block抽象为特质Memo...

qq_22473333的博客 848

数字人接大模型第二步:语音克隆

推荐XTTS-v2项目,由Coqui公司开发的语音生成模型,专为多语言语音克隆和生成设计。它支持17种语言,包括英语、西班牙语、法语、德语、意大利语、葡萄牙语、波兰语、土耳其语、俄罗斯语、荷兰语、捷克语、阿拉伯语、中文、日语、匈牙利语、韩语和印地语。XTTS-v2的核心优势在于其仅需6秒的音频片段即可实现语音克隆,无需大量的训练数据。此外,它还支持情感和风格转移、跨语言语音克隆以及多语言语音生成,采样率高达24kHz。地址:https://github.com/archwesome/XTTS-v2。

405

【GRASS GIS零基础入门教程】2.1:初识GRASS GIS软件

GRASS GIS是一个强大的计算引擎,用于栅格、矢量和地理空间处理。它支持地形和生态系统建模、水文、数据管理和图像处理。通过内置的时态框架和Python API,它可以进行高级时间序列分析和快速地理空间编程,并针对各种硬件配置的大规模分析进行优化。

智慧空间实验室 849

JVM - GC

1、垃圾回收 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了。 1.1、C/C++语言的垃圾回收 在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete关键字释放内存资源。 如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,最终可能会导致内存...

Thread_v的博客 730

开源Harness项目DeerFlow 2.0,让智能体几乎能完成任何复杂任务

从提示工程到上下文工程,再到如今的 Harness,这条演进路径的本质是从“教模型如何理解人类”迈向“为模型构建一个可执行、可信赖、可长期运转的数字世界”。 当越来越多像 DeerFlow 2.0 这样的 Super Agent Harness 走向普及,AI 将真正进化为能理解、会规划、可执行、敢交付、长期负责的成熟生产力形态。

技术引领业务创新 522

JVM 如何分析 GC 日志,定位 GC 性能问题?

分析 GC 日志是 JVM 调优的重要环节。通过分析 GC 日志,可以了解 JVM 的内存使用情况、GC 的频率、停顿时间、回收效率等,从而找出潜在的性能问题,并进行相应的优化。

专注于技术分享 1778

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

排查一次GC问题

GC问题的排查有两个方面的入手点 (1)排查GC问题的关键还是搞清楚内存到底被什么东西占用着,什么东西没有释放,内存是怎么分布的。 (2)同时GC是一个动态的过程,又要结合代码的运行过程,去判断什么到底什么情况下会出现问题,并最终得到修改问题的地方 如果你熟悉代码,那么GC过程理应是白盒,那么相对而言,你发现问题的过程很大程度上是围绕第一点去做,也更快速 如果你不熟悉代码,那么GC过程就是黑盒,那么你的过程最好还是从(1)到(2),先搞清楚内从里的内容,再去考虑代码中有可能出现问题的点,再结合运行时

u014783007的博客 1407

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

生产GC问题排查方案

通过此方案,可系统化解决生产环境90%以上的GC问题,平均恢复时间(MTTR)缩减50%+。

code_fly 938

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

full gc频繁有什么问题_ES频繁GC问题一例

收到ES的告警,在1小时内意外分配了碎片,从而导致集群状态 Green > Yellow > Red > Yellow > Green 频繁切换?在此期间,ES不可访问,并且调用API开始返回非200的状态码。环境3个主节点和3个工作节点。错误分析GC锯尺图这种锯尺模式的原因是,ELasticsearch在执行某些操作搜索查询,写入查询,刷新,刷新操作等,频繁的创建新对象,...

weixin_29894211的博客 2186

你们要的线上GC问题案例来啦

点击↑上方↑蓝色“编了个程”关注我~这是Yasin的第 45 篇原创文章Y说今天上午被阿里罚款的消息刷屏了。这个事情也发酵很长一段时间了,今天算是尘埃落定吧。听说因为这事股价蒸发了一千亿美...

yasinshaw的博客 366

如何有效判断与排查Java GC问题

在 Java 应用程序中,垃圾回收(Garbage Collection,GC)是自动管理内存的重要机制。然而,GC 操作可能会导致应用程序出现性能问题,如响应时间变长、吞吐量下降等。下面详细介绍如何有效判断与排查 Java GC 问题。

TEUTEU的博客 1199

GC问题排查实战一

GC问题排查实战一前言GC信息参数配置信息gceasy分析内存使用GC时间指标交互图信息GC之后的堆情况分析GC过程的持续时间分析GC暂停时间分析缺失的数据问题回收的容量分析 前言 最近在进行GC的相关调优和问题排查,进行了一个全用例的场景压测,可以抽象为5W用户连接,500QPS并发,然后持续大致24个小时。随后进行一些分析,并找出其中可能存在的问题,以及可以优化的方向。 GC信息 参数配置信息 -Xms12G -Xmx12G -Xmn4G -XX:MetaspaceSize=300M -XX:Surv

王伟王胖胖的博客 1098

Metaspace GC 问题排查

背景描述 查看应用JVM监控发现发生了连续两次 Full GC,导致 GC 的原因是什么? Full GC 监控: metaspace利用率监控: 问题排查 环境信息 生产环境,JDK1.8 关键JVM参数: -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CM

森伯416的博客 4397

如何有效判断与排查 Java GC 问题

Java 垃圾回收(GC)是 JVM 内存管理的重要组成部分,其执行过程往往伴随着应用程序的停顿、吞吐量降低等性能代价。通过合理的方法判断 GC 问题是否为性能问题的根因,并采取相应的排查步骤和解决策略,能够有效优化 GC 性能,提升应用系统的稳定性和用户体验。

陈辰学长的博客 1293

Java中 9 种常见的 CMS GC 问题分析与解决

目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 2.5 收集器 2.6 常用工具 3. GC 问题判断 3.1 判断 GC 有没有问题? 3.2 判断是不是 GC 引发的问题? 3.3 问题分类导读 4. 常见场景分析与解决 4.1 场景一:动态扩容引起的空间震荡 4.2 场景二:显式 GC 的去与留 4.3 场景三

魏小言的博客 2188

9种常见的CMS GC问题分析与解决

1. GC 问题判断 在做 GC 问题排查和优化之前,我们需要先来明确下到底是不是 GC 直接导致的问题,或者应用代码导致的 GC 异常,最终出现问题。 1.1 判断 GC 有没有问题? 1.1.1 设定评价标准 评判 GC 的两个核心指标: 延迟(Latency): 也可以理解为最大停顿时间,即垃圾收集过程中一次 STW 的最长时间,越短越好,一定程度上可以接受频次的增大,GC 技术的主要发展方向。 吞吐量(Throughput): 应用系统的生命周期内,由于 GC 线程会占用 Mutator 当前可用

m0_37235955的博客 2908

GC - Java 垃圾回收器之CMS GC问题分析与解决

自 Sun 发布 Java 语言以来,开始使用 GC 技术来进行内存自动管理,避免了手动管理带来的悬挂指针(Dangling Pointer)问题,很大程度上提升了开发效率,从此 GC 技术也一举成名。GC 有着非常悠久的历史,1960 年有着“Lisp 之父”和“人工智能之父”之称的 John McCarthy 就在论文中发布了 GC 算法,60 年以来, GC 技术的发展也突飞猛进,但不管是多么前沿的收集器也都是基于三种基本算法的组合或应用,也就是说 GC 要解决的根本问题这么多年一直都没有变过。笔者认

珍惜当下 998
上一篇: jvm 监控工具jps、jstack、jmap、jhat、jstat、hprof
下一篇: 一次线上服务fullGC原因排查
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值