热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【经验分享】OOM故障分析记录:byte[]占用了大量内存

现象:工作时遇到某个服务老是频繁重启,日志报错为OOM分析:出现OOM是因为整个堆内存不够用了,此时JVM首先尝试扩展更多的空间,其次GC尝试回收内存,前两种方法无果的情况下只能报

现象:

工作时遇到某个服务老是频繁重启,日志报错为OOM


分析:

出现OOM是因为整个堆内存不够用了,此时JVM首先尝试扩展更多的空间,其次GC尝试回收内存,前两种方法无果的情况下只能报OOM并退出

可能的情况:内存不够、内存泄漏


尝试解决问题的步骤:



  1. 加上JVM参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath= ,设置当出现OOM时,dump整个堆的信息

  2. 等OOM后,将文件拷贝到电脑上

  3. 用JDK自带的 visualVM,打开dump文件

    设置了最大堆大小 512M,从下图看出,确实占满了导致OOM

    20191122170147350.png

  4. 转到类实例占用大小视图,找到占用最大的类

    image.png

    可以看到,总共512M堆大小,byte[]对象占用了其中的90%,这显然是异常占用

    接下来转到实例视图,查看具体的实例

    image.png

    最大的byte[]对象占用了 约 10M

    拷贝byte[]对象中存储的内容,并在代码中构建byte[]对象存入String打印出可视化内容

    image.png

    打印出的部分String内容如下,可以看到存储的是 http header的内容,并且byte[]中99%的内容为0,说明大量空间并未被使用到

HTTP/1.1 200
Access-Control-Allow-Origin: *
Access-Contr

选其中的一个,选择显示最近的垃圾回收根节点

image.png

看到持有这个byte[]对象的是一个 HeapByteBuffer对象,HeapByteBuffer是java NIO中的对象。


程序中没有使用NIO,推测NIO应该在Tomcat中被使用,并且Tomcat的默认配置不可能为 10M这么不合理的值,那感觉可能是有不合理的自定义配置存在。

于是先去项目中找到如下相关配置:

image.png

发现,Tomcat中最大请求头大小被设置为 10M,和刚才byte[]对象占用的大小相似(多出的应为对象头以及其他多申请的空间,具体要参考源码),其次也和前面发现的byte[]对象中存储的是请求头信息的事实相符合,这应该就是问题所在,把这个配置调小点或者干脆使用默认配置即可。


问题总结:


咨询了相关同事,为了传输较大的文件,调大了 tomcat max-http-post-size,顺手改了 max-http-header-size,容器初始化处理请求的线程池时,每个线程都会申请 此处为 10M大小的byte[]对象,并且请求处理线程的生命周期一般和服务的生命周期一致,也就是说,线程持有的 byte[]对象在整个服务周期中是一直存活的。一般线程池的规模少说也在几十个,也意味着服务正常工作时,几百兆的堆内存(也可能是堆外内存,具体看Tomcat配置使用哪个)会被请求处理线程一直占用,当分配的内存较少时,很快OOM

转载:一次OOM故障分析记录:HeapByteBuffer byte[] 占用了大量内存



推荐阅读
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 本文详细探讨了在Java TCP编程中,如何理解和测量并发连接数、请求数及并发用户数,并提供了实际应用中的测试方法和优化建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 本文旨在探讨设计模式在Visual FoxPro (VFP) 中的应用可能性。虽然VFP作为一种支持面向对象编程(xbase语言)的工具,其OO特性相对简明,缺乏高级语言如Java、C++等提供的复杂特性,但设计模式作为一种通用的解决方案框架,是否能有效应用于VFP,值得深入研究。 ... [详细]
  • NPM 脚本 'start' 退出,未显示 create-react-app 服务器正在监听请求
    遇到 NPM 脚本 'start' 退出且未显示 create-react-app 服务器正在监听请求的问题,请求帮助。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • Uniswap 与 MoonPay 合作,引入法币交易功能。本文探讨这一合作对用户进入加密货币领域的安全性及便利性的影响。 ... [详细]
  • CSS Border 属性:solid 边框的使用详解
    本文详细介绍了如何在CSS中使用solid边框属性,包括其基本语法、应用场景及高级技巧,适合初学者和进阶用户参考。 ... [详细]
author-avatar
vegg巛iegbaby
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有