1. 堆溢出定位与分析-云社区-华为云

建议使用以下浏览器,以获得最佳体验。 IE 11.0 + 以上版本 Chrome 43+ 谷歌浏览器 Firefox 38+ 火狐浏览器

[华为云 提供云计算服务堆溢出定位与分析-云社区-华为云 - 图1

](https://www.huaweicloud.com/)

    1. 热门搜索

开发者

取消

Java,JVM

云社区 博客 博客详情

堆溢出定位与分析

堆溢出定位与分析-云社区-华为云 - 图3 51CTO 发表于 2020-12-15 00:39:27 2020-12-15

124

0

0

Java JVM


【摘要】 1. 错误信息 Java Heap 出现 OOM,基本可以分为两个原因:JVM 堆分配的空间不够,数据量大时出现堆溢出内存泄漏:由于程序处理不当,每次执行都会产生新的垃圾对象占用内存,随着时间推移,JVM 内存空间被消耗殆尽,出现 OOM2. 定位过程 2.1.JVM 堆使用情况 jmap -heap pidjmap -heap pid 首先查看 java 堆信息,我们可以发现 JVM 老年代 (Old Gen…

1. 错误信息

堆溢出定位与分析-云社区-华为云 - 图4

Java Heap 出现 OOM,基本可以分为两个原因:

  1. JVM 堆分配的空间不够,数据量大时出现堆溢出
  2. 内存泄漏:由于程序处理不当,每次执行都会产生新的垃圾对象占用内存,随着时间推移,JVM 内存空间被消耗殆尽,出现 OOM

2. 定位过程

2.1.JVM 堆使用情况

|

jmap -heap pid

|

  1. jmap -heap pid

首先查看 java 堆信息,我们可以发现 JVM 老年代 (Old Generation) 的使用率 (74.2%) 明显偏高,但不知道是什么原因引起,我们查看一下 JVM 内存回收情况。

堆溢出定位与分析-云社区-华为云 - 图5

2.2 Jvm 内存回收情况

|

jstat -gcutil pid 1000ms

|

  1. jstat -gcutil pid 1000ms

可以看到从程序启动到现在共经历了 5 次 Full GC,频率不算高,约 10 分钟进行一次 Young GC,时间约为 40ms, 内存回收情况无明显异常。

感觉不是内存泄漏而是堆空间过小导致的,为了验证接下来我们尝试寻找是哪些对象占据了大多数内存

堆溢出定位与分析-云社区-华为云 - 图6

参数简介:

  1. S0C:第一个幸存区的大小
  2. S1C:第二个幸存区的大小
  3. S0U:第一个幸存区的使用大小
  4. S1U:第二个幸存区的使用大小
  5. EC Eden区的大小
  6. EU Eden区的使用大小
  7. OC 老年代大小
  8. OU 老年代使用大小
  9. MC 方法区大小
  10. MU 方法区使用大小
  11. CCSC: 压缩类空间大小
  12. CCSU: 压缩类空间使用大小
  13. YGC 年轻代垃圾回收次数
  14. YGCT: 年轻代垃圾回收消耗时间(s)
  15. FGC 老年代垃圾回收次数
  16. FGCT:老年代垃圾回收消耗时间(s)
  17. GCT 垃圾回收消耗总时间(s)

2.3 JVM 堆占用情况

  1. jmap -histo pid

通过查看 Jvm 堆中对象的具体信息,可以看到占用了大量空间的对象有 byte 数组、HashMap 和对象数组,但是这些对象的具体内容无法得知,所以将堆 dump 下来做进一步分析。

堆溢出定位与分析-云社区-华为云 - 图7

2.4 JVM dump 文件分析

|

jmap -dump:``format``=b,``file``=serviceDump.dat 28111

|

  1. jmap -dump:format=b,file=serviceDump.dat 28111

如下图,可以看到 HashMap$Node 占用了最多的空间,将 HashMap 按照大小排序,查看 map 中的值,发现绝大数都是程序运行所需的对象,程序本身产生的对象占用很少的空间。

Jimmy 发现有一个名叫 java.security.cert.TrustAnchor 出现了约 150 万个实例,而这个类一般用于鉴权认证,理论上不应该出现这么多实例,所以我们去查看模块中与鉴权有关的操作。

堆溢出定位与分析-云社区-华为云 - 图8

堆溢出定位与分析-云社区-华为云 - 图9

2.5 代码分析

通过查看模块发现,用到证书认证或者鉴权的操作只出现在调用 AWS Lambda 客户端时,代码如下,可以看到每次请求时都会新生成一个 LambdaClient 实例,

所以我们猜测JVM 发生 GC 时,只回收了 LambdaClient 实例但没有回收用于 CA 认证的 TrustAnchor,导致该实例一直被标记,然后晋级到 Jvm 老年代,最终导致老年代使用率一直增加。

  1. LambdaClient lambdaClient = getLambdaClient(requestData);
  2. InvokeRequest invokeRequest = InvokeRequest.builder() .functionName(getFunctionName(requestData.getProjectName())) .payload(SdkBytes.fromUtf8String(gson.toJson(requestData.data))) .build();
  3. InvokeResponse invokeResponse = lambdaClient.invoke(invokeRequest);
  4. public LambdaClient getLambdaClient(RequestData requestData) { if ("ci".equals(configurableApplicationContext.getEnvironment().getProperty("spring.profiles.active"))) { return LambdaClient.builder() .region(Region.US_EAST_1) .endpointOverride(URI.create(getLambdaEndpointUrl(requestData.getProjectName(), requestData.getAlexaRegion()))) .build(); } else { //do something to choose region, then get LambdaClient by this region } return LambdaClient.builder() .region(region) .build(); }
  5. }

2.6 问题解决

基于上述问题,可以有两种优化方案:

  1. 每次调用 LambdaClient 后调用 close 方法显式关闭客户端

  2. 将需要的客户端封装为单例,需要时直接取用,避免每次使用时新创建对象

这里我们采用第一种方案进行测试,将服务部署到 ci 环境后运行一段时间,查看堆使用率,如下

堆溢出定位与分析-云社区-华为云 - 图10

文章来源: blog.51cto.com,作者:卫莨,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.51cto.com/acevi/2564090

登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

Java JVM

展开全部内容)

评论文章 // 点赞 收藏 0

点赞

0

收藏

;)

链接复制成功

复制链接到剪贴板

堆溢出定位与分析 1. 错误信息 Java Heap 出现 OOM,基本可以分为两个原因:JVM 堆分配的空间不够,数据量大时出现堆溢出内存泄漏:由于程序处理不当,每次执行都会产生新的垃圾对象占用内存,随着时间推移,JVM 内存空间被消耗殆尽,出现 OOM2. 定位过程 2.1.JVM 堆使用情况 jmap -heap pidjmap -heap pid 首先查看 java 堆信息,我们可以发现 JVM 老年代 (Old Gen…&url=https://bbs.huaweicloud.com/blog/224278)

分享文章到微博

分享文章到朋友圈

分享

上一篇:Grep 工具、Shell 脚本及 Vimtutor 基础

下一篇:java 单例模式浅析

相关文章

评论 (0)


0/1000

取消 更新评论

0/1000

评论

登录后可评论,请 登录注册

评论

您没有权限执行当前操作

堆溢出定位与分析-云社区-华为云 - 图11

51CTO

[文章:

5738

篇](/community/usersnew/id_1601366260454001) 粉丝: 14 人

51CTO 是一家综合的 IT 技术用户服务平台,立足满足用户多维度需求,为技术用户成长赋能。2005 年成立至今,拥有专业主流技术媒体 51CTO 企业信息化媒体 CIOAge 中国最大的 IT 在线教育平台 51CTO 学院。目前拥有信息完善,细分标签的注册用户 1700 万 +。

  • 关注

相关文章

文中提到的产品 (_

4

_)

[

云搜索服务

云搜索服务是一个基于公有云基础架构和平台且完全托管的在线分布式搜索引擎服务,为…

](http://www.huaweicloud.com/product/es.html)[

实时流计算服务

实时流计算服务(Cloud Stream Service,简称 CS),是运行在华为云上的实时流式大数…

](http://www.huaweicloud.com/product/cs.html)[

云目录服务

云目录服务是创建和管理 IT 服务目录的管理服务,多适用于企业部署开发环境、应用软件…

](http://www.huaweicloud.com/product/ccs.html)[

部署

部署服务(DeployMan)提供可视化、一键式部署服务,支持并行部署和流水线无缝集…

](http://www.huaweicloud.com/product/deployman.html)

博主其他文章

更多

温馨提示

您确认删除评论吗?

确定

取消

温馨提示

堆溢出定位与分析-云社区-华为云 - 图13

您确认删除评论吗?

删除操作无法恢复,请谨慎操作。

确定

取消

温馨提示

您确认删除博客吗?

确定

取消

确认删除 [堆溢出定位与分析-云社区-华为云 - 图14

](#)

您确认删除博客吗?

取消 确定

确认删除 [堆溢出定位与分析-云社区-华为云 - 图15

](#)

您确认删除评论吗?

取消 确定

温馨提示

登录超时或用户已下线,请重新登录!!!

确定

取消

新窗

关闭

建议使用以下浏览器,以获得最佳体验。 IE 9.0 + 以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器

温馨提示

确定

温馨提示

您的账号尚未经过实名认证,不能进行该操作,是否前往认证?

前往认证

温馨提示

确定

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过 10 个汉字或 20 个英文字符,设置后 3 个月内不可修改。

确定

确定

我再想想

温馨提示

登录超时或用户已下线,请重新登录!!!

确定

取消

提示

堆溢出定位与分析-云社区-华为云 - 图16

您发布的内容检测到敏感词”

如点击继续发布,敏感词将以 “*” 代替

返回修改

继续发布

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过 10 个汉字或 20 个英文字符,设置后 3 个月内不可修改。

*长度不超过 10 个汉字或 20 个英文字符,设置后 3 个月内不可修改。

确认;) 取消;)

确定

确定

确定

确定

确定

确定

热门产品

售前咨询热线

950808 转 1

下载华为云 APP

关注我们

关注华为云

[

4000 955 988

950808 转 1

](tel:4000955988)

华为云微信

扫描二维码

[

华为云微博

扫描二维码

](//weibo.com/p/1006061930559805)

华为云 app

扫描下载华为云 APP

售前咨询:950808 转 1

堆溢出定位与分析-云社区-华为云 - 图17

长按 / 截图保存,微信识别二维码
或者关注公众号 “华为云”

关于华为云

了解华为云

华为云 APP

客户案例

信任中心

法律协议

联系我们

加入我们

支持与服务

授权销售支持中心

开发者中心

管理控制台

售前咨询

服务公告

支持计划

云闪贷

实用工具

文字识别

漏洞扫描

语音识别

域名注册

智能客服

会议管理

热门产品

免费试用

云服务器

网站建设

CDN 加速

区块链

云手机

快速链接

华为官网

华为消费者业务

华为开发者联盟

华为企业业务

华为商城

花粉俱乐部

热门推荐

SMN 优势 ERP 案例 开发者大会 硬件商城 济宁携手推进制造业与互联网深度融合发展 IP 加速 Gson 简介 会务软件系统 访问 API ARC 知识 测试方法 DMA 控制 开发者大会 HDC HDC 开发者大会时间 出席 BIRTV 分享全媒体时代下的融合媒体云实践 换域名 控制列表 网站用户名 交易统计管理 FLV 压缩 2021HDC 大会 查询 SSL 爬虫抓取图片 参加 HDC 贾永利:+AI,创造软件全新未来 IP 代理 共享备案 管理员登陆 JS 基础 云集精英之我的创业故事(二)Testbird 李伟:庆幸站在了创业的风口上 删除 Topic 业务随行 商品升级 发起成立智能物联模型特设组通过 AII 全会审议设立 华为 HDC 专场 云测试 商品购买流程 Oracle 失效 云缓存 全球首款基于 Kubernetes 的 Serverless 容器服务正式商用发布

版权所有 © 华为软件技术有限公司 2021 保留一切权利 苏 ICP 备 17040376 号 - 32 苏 B2-20130048 号 代理域名注册服务机构:新网

苏公网安备 32011402010636 号

手机扫码分享给好友