iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >java内存异常使用导致full gc频繁如何解决
  • 636
分享到

java内存异常使用导致full gc频繁如何解决

2023-07-06 12:07:03 636人浏览 八月长安
摘要

这篇文章主要介绍了java内存异常使用导致full GC频繁如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内存异常使用导致full gc频繁如何解决文章都会有所收获,下面我们

这篇文章主要介绍了java内存异常使用导致full GC频繁如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内存异常使用导致full gc频繁如何解决文章都会有所收获,下面我们一起来看看吧。

问题系统

日常巡检发现,应用线上出现频繁full gc

现象

应用线上出现频繁full gc


java内存异常使用导致full gc频繁如何解决

排查过程

分析dump

拉dump文件:小插曲:dump时如果指定:live,则在dump前JVM会先进行一次full gc,并且gc log里会打印dump full gc,这种对非内存泄漏导致的线上异常内存情况排查反而会带来不便,导致我们多dump了好几次。

分析dump文件:

a. 发现大量long[]数组占用最大空间,有异常情况


java内存异常使用导致full gc频繁如何解决

b. 查看gc根节点,发现这些long[]数据大部分是被org.HdrHistogram.Histogram持有,每个Histogram对象会持有一个2048size的long[]

c. 查看Histogram实例的数量,竟然有5w个,对比下正常项目的堆栈,大约是100倍


java内存异常使用导致full gc频繁如何解决

d. 这里又有一个插曲,一开始习惯用mat分析,但是mat生成的报告对分析泄露比较有用,对于分析异常的内存没有jvisualvm.exe和idea的profiler好用

排查原因

本地启动,可以复现这个类的内存使用情况,于是本地起一个其他内存正常的服务与有问题的应用,分析内存对比

这里用的是idea的profiler,很方便

发现差异:

对比正常的应用,发现异常应用的引用存在异常的来自
java内存异常使用导致full gc频繁如何解决
java内存异常使用导致full gc频繁如何解决

● rx.internal.operators.OnSubscribeReduceSeed$ReduceSeedSubscriber的引用,怀疑就是这个异常引用就是导致这些实例无法在新生代回收而是堆积到了老年代触发full gc的原因

排查差异:

简单看了下相关代码,看不出个所以然,直接debug对比

系统确实走进了相关的代码,增加了对Histogram的引用,而正常应用没有
java内存异常使用导致full gc频繁如何解决

但是光这样也看不出来为什么,此时关注到了左下角的线程池,这个线程池比较奇怪,是Metric的线程池
Metric是Hystrix用来统计相关指标,来供自己的dashboard或者用户来获取,以此来了解系统熔断相关参数和指标的功能
再看堆栈,走到这里的逻辑是


java内存异常使用导致full gc频繁如何解决

这个流用来统计单位时间内的系统指标,导致Hystrix使用Histogram的long数组实现类似滑动窗口的效果统计单位时间内的指标
Histogram本身是Hystrix用来实现类似桶+滑动窗口的功能,来统计单位时间内的流量,但是因为开启了指标参数,导致hystrix为了统计更长时间范围内的指标,新增了对象持有更多(单位时间内)的Histogram引用来聚合,这部分引用因为是统计更长时间范围周期的,就会因为引用持有时间长而到老年代,但是本质并不是内存泄漏,所以每次full gc后又可以得到回收

解决问题

看到上面的差异和怪异的线程池,第一反应就是关闭metric使应用不走到这段逻辑中增加引用,看官方文档,该配置默认是打开的,并且确认该功能只影响指标统计不影响断路器本身功能,使用配置hystrix.metrics.enabled=false配置来关闭
新增配置后,验证并查看堆栈,引用恢复正常,并且系统在一段时间后并没有新增更多的Histogram实例,发布线上后观察一段时间,full gc问题确实得到解决

根本原因

在当时发现解决的办法并验证后,并没有时间去研究hystrix.metrics.enabled默认配置就是true但是其他应用没有出现这个full gc问题的原因, 先解决了之后后续再继续跟进排查根本原因防止其他项目也出现相同问题

之前发现可疑的线程池是HystrixMetricsPoller ,经过查看,该线程池由HystrixMetricsPollerConfiguration


java内存异常使用导致full gc频繁如何解决

类开启,主要依靠hystrix.metrics.enabled开启,但是默认是true,为什么其他项目没有开启呢?

搜了下源码,这个类的开启还和一个注解有关


java内存异常使用导致full gc频繁如何解决

对比了一下代码,果然只有异常的应用使用了这个注解,这个注解的目的是开启断路器

但是研究之后发现,不使用这个注解,熔断等功能依旧可用,原因是在spring-cloud高版本之后,spring通过使用hystrix封装openfeign的方法来使用熔断,而不是集成整个hystrix体系,可能spring-cloud也发现了hystrix内存使用上的问题

所以在较高版本(起码我们的版本),feign是通过feign.hystrix.enabled来开关断路器的(这个开关是关闭的话,单纯加@EnableCircuitBreaker注解断路器是不会生效的)

其实在更高点版本的spring-cloud中,@EnableCircuitBreaker这个注解已经被标注为废弃了,但是可能因为我们是中间版本,所以存在既没有标注废弃其实又没有什么用的情况

总而言之,feign的断路功能只通过feign.hystrix.enabled来控制,增加@EnableCircuitBreaker注解之后仅仅只是会开启Hystrix其他所有的指标等功能


java内存异常使用导致full gc频繁如何解决

关于“java内存异常使用导致full gc频繁如何解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“java内存异常使用导致full gc频繁如何解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: java内存异常使用导致full gc频繁如何解决

本文链接: https://www.lsjlt.com/news/358435.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java内存异常使用导致full gc频繁
    目录问题系统现象排查过程分析dump排查原因排查差异:解决问题根本原因问题总结问题根本原因问题系统 日常巡检发现,应用线上出现频繁full gc 现象 应用线上出现频繁full gc...
    99+
    2023-05-16
    fullgc频繁的原因 频繁发生Full GC 频繁的fullgc解决办法
  • java内存异常使用导致full gc频繁如何解决
    这篇文章主要介绍了java内存异常使用导致full gc频繁如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内存异常使用导致full gc频繁如何解决文章都会有所收获,下面我们...
    99+
    2023-07-06
  • mysql内存表导致内存溢出如何解决
    内存表导致内存溢出的问题可以通过以下几种方式解决: 增加服务器内存:如果内存表导致内存溢出,可以尝试增加服务器的内存,以提供更多...
    99+
    2024-04-09
    mysql
  • c++循环引用导致的内存泄露如何解决
    在 C++ 中,循环引用(circular reference)是指两个或多个对象相互引用,导致内存泄漏的情况。解决循环引用导致的内...
    99+
    2023-10-10
    c++
  • 如何解决Redis内存数据满了导致宕机问题
    这篇文章主要讲解了“如何解决Redis内存数据满了导致宕机问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决Redis内存数据满了导致宕机问题”吧!...
    99+
    2024-04-02
  • java内存使用率过高如何解决
    如果Java内存使用率过高,可以考虑以下几个解决方法: 调整Java虚拟机的内存参数:可以通过调整-Xmx和-Xms参数来增加或...
    99+
    2024-02-29
    java
  • 不规范使用ThreadLocal导致bug如何解决
    这篇文章主要讲解了“不规范使用ThreadLocal导致bug如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不规范使用ThreadLocal导致bug如何解决”吧!因为线程重用导致的...
    99+
    2023-07-04
  • Java中使用throw-throws抛出异常如何解决
    这篇文章将为大家详细讲解有关Java中使用throw-throws抛出异常如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、throws抛出异常   &...
    99+
    2023-06-20
  • java导出大量数据内存溢出如何解决
    在处理大量数据时,可能会遇到内存溢出的问题。以下是一些解决方法:1. 使用合适的数据结构:确保选择适合处理大量数据的数据结构。例如,...
    99+
    2023-08-20
    java
  • Linux下如何解决因php-cgi占内存100%导致的电脑很卡
    本篇内容介绍了“Linux下如何解决因php-cgi占内存100%导致的电脑很卡”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  网站日志目...
    99+
    2023-06-13
  • 使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
    如下 复制代码 代码如下: <div style="width:100px;height:100px;background:gold"></div> 用I...
    99+
    2022-11-21
    滤镜设置 透明
  • 如何使用Promise解决多个异步Ajax请求导致的代码嵌套问题
    这篇文章将为大家详细讲解有关如何使用Promise解决多个异步Ajax请求导致的代码嵌套问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题前端小同学在做页面的时候,犯...
    99+
    2024-04-02
  • java应用占用内存过高如何解决
    java应用占用内存过高如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序...
    99+
    2023-06-06
  • php使用redis内存不足如何解决
    这篇文章主要介绍了php使用redis内存不足如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php使用redis内存不足如何解决文章都会有所收获,下面我们一起来看看吧。php使用redis内存不足的解决...
    99+
    2023-07-04
  • 如何解决使用Google CDN导致网站页面无法加载的问题
    本篇内容主要讲解“如何解决使用Google CDN导致网站页面无法加载的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决使用Google CDN导致网站页面无法加载的问题”吧!国内网非...
    99+
    2023-06-10
  • Android中使用Handler造成的内存泄露如何解决
    这篇文章将为大家详细讲解有关Android中使用Handler造成的内存泄露如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、什么是内存泄露?  Java使用有向图机制,通过GC自动...
    99+
    2023-05-30
    android handler
  • Android中使用webview时出现内存泄露如何解决
    Android中使用webview时出现内存泄露如何解决,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.避免在xml直接写webview控件,这样会引用activity,...
    99+
    2023-05-31
    android webview
  • 如何解决使用stream将list转map时key重复导致报错的问题
    这篇文章将为大家详细讲解有关如何解决使用stream将list转map时key重复导致报错的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。要将List对象集合转为map集合,可以通过stream流的形...
    99+
    2023-06-15
  • 美国轻量化云服务器CPU使用异常如何解决
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-23
  • Excel数据导入Mysql常见问题汇总:如何解决导入大量数据时内存溢出的问题?
    Excel数据导入Mysql常见问题汇总:如何解决导入大量数据时内存溢出的问题?导入Excel数据到Mysql数据库是一个常见而重要的任务,在处理大量数据时,有时会遇到内存溢出的问题。本文将介绍一些解决这一问题的方法。拆分数据:如果Exce...
    99+
    2023-10-22
    Excel MySQL 内存溢出 解决问题 导入
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作