Java web应用性能分析之【6种OOM监控和分析】

 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客

Java web应用性能分析概叙-CSDN博客

Java web应用性能分析之【基准测试】-CSDN博客

Java web应用性能分析之【sysbench基准测试】-CSDN博客

Java web应用性能分析之【CPU飙升分析概述】-CSDN博客

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客

Java web应用性能分析之【OOM监控分析之Allocation Failure】-CSDN博客

概叙

  1. 堆溢出-java.lang.OutOfMemoryError: Java heap space。 检查大对象
   2. 栈溢出-java.lang.OutOfMemorryError:unable to create new native thread    检查多线程
   3. 栈溢出-java.lang.StackOverFlowError。 检查递归
   4. 元信息溢出-java.lang.OutOfMemoryError: Metaspace。
   5. 直接内存溢出-java.lang.OutOfMemoryError: Direct buffer memory。 排查nio,一般重点检查netty,它里面的nio用直接内存用的多
   6. GC超限-java.lang.OutOfMemoryError: GC overhead limit exceeded。

        OOM是java应用都会遇到的错误,原因就是java进程中向jvm申请内存得不到满足,jvm没得办法发出来的错误提示。作为合格的开发,应该知道如何排查oom,以及如何解决oom。

排查OOM的步骤

1.看错误日志:“Caused by: java.lang.OutOfMemoryError: Java heap space”附近就可以看到业务代码引起oom的位置“at com.zxx.study.web.controller.OomController.javaHeapSpace(OomController.java:56)”

2.分析jvm的dump文件:如java自带工具VisualVM就能很容易分析,并定位oom位置。

3.定位oom:一般都是根据12两步,去找出代码中触发oom的点

4.合理设置jvm各个区块大小:一般通过jstat监控gc和各个区块内存使用情况,来判断我们的jvm设置是否合理。

        由于篇幅限制,也便于查看,后面5种情况,将单独发文分析。当然也欢迎感兴趣的小伙伴对文章中的三个问题进行讨论。

思考问题:1.OutOfMemoryError不是Error吗,为什么回被全局Exception异常捕捉?(有兴趣的欢迎评论交流)

思考问题:2.我们的java进程就是个springboot的jar包,默认用的是tomcat服务器,都知道tomcat的线程池默认初始化10个线程来处理我们的业务请求,想想看为啥当业务线发生oom异常时,这个线程咋地还能处理业务,没有被回收?(下面监控里面还是10个线程,线程编号还是1到10)

问题思考:为什么这里发生了oom“OutOfMemoryError: Java heap space”时触发了“Allocation Failure”,但是可以恢复?只是阻碍了一会儿业务,后面业务访问就正常了?(有兴趣的欢迎评论交流)

6种OOM现象

  1. 堆溢出-java.lang.OutOfMemoryError: Java heap space。 检查大对象

        

        从上面业务访问来看,触发了OOM后,我们的业务返回结果是“网络超时、请稍后操作”,后面用正常url访问时,业务访问正常。

        思考问题:1.OutOfMemoryError不是Error吗,为什么回被全局Exception异常捕捉?(有兴趣的欢迎评论交流)

思考问题:2.我们的java进程就是个springboot的jar包,默认用的是tomcat服务器,都知道tomcat的线程池默认初始化10个线程来处理我们的业务请求,想想看为啥当业务线发生oom异常时,这个线程咋地还能处理业务,没有被回收?(下面监控里面还是10个线程,线程编号还是1到10)

        监控里面还是10个线程,线程编号还是1到10

监控情况

通过jstat 统计gc情况和jvm各个内存区快使用情况

        问题思考:为什么这里发生了oom“OutOfMemoryError: Java heap space”时触发了“Allocation Failure”,但是可以恢复?只是阻碍了一会儿业务,后面业务访问就正常了?(有兴趣的欢迎评论交流)

        java进程运行时日志,“Caused by: java.lang.OutOfMemoryError: Java heap space”附近就可以看到业务代码引起oom的位置“at com.zxx.study.web.controller.OomController.javaHeapSpace(OomController.java:56)”

OOM时dump了现场,可以看到当前进程4366的内存dump文件

  

    2. 栈溢出-java.lang.OutOfMemorryError:unable to create new native thread    检查多线程


   3. 栈溢出-java.lang.StackOverFlowError。 检查递归


   4. 元信息溢出-java.lang.OutOfMemoryError: Metaspace。


   5. 直接内存溢出-java.lang.OutOfMemoryError: Direct buffer memory。 排查nio,一般重点检查netty,它里面的nio用直接内存用的多


   6. GC超限-java.lang.OutOfMemoryError: GC overhead limit exceeded。    

验证前的准备

1.验证6种场景的代码,见下面文章

Java web应用性能分析之【6种OOM模拟】-CSDN博客

2.模拟正常访问的业务请求:6种请求对应6个场景;异常场景只需要修改一下传入参数name=zhouxx1  只要name!=zhouxx就会触发oom。

 curl  http://127.0.0.1:6002/api/v1/oom/javaHeapSpace?name=zhouxx >/dev/null &
 curl  http://127.0.0.1:6002/api/v1/oom/stackOOM?name=zhouxx >/dev/null &
 curl  http://127.0.0.1:6002/api/v1/oom/stackOverFlow?name=zhouxx >/dev/null &
 curl  http://127.0.0.1:6002/api/v1/oom/metaspaceOOM?name=zhouxx >/dev/null &
 curl  http://127.0.0.1:6002/api/v1/oom/directBufferOOM?name=zhouxx >/dev/null &
 curl  http://127.0.0.1:6002/api/v1/oom/GCOverheadOOM?name=zhouxx >/dev/null &

3.启动参数

启动参数
JAVA_OPTS=" -server -Dfile.encoding=UTF-8 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8899 -Dcom.sun.management.jmxremote.authenticate=false -Dapp.config=/home/web/demo/application.yaml -Xms64m -Xmx64m  -Xss1m -XX:MetaspaceSize=16m -XX:MaxMetaspaceSize=64m -XX:+UseG1GC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintCommandLineFlags -Xloggc:log/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=log/"

启动命令
java $JAVA_OPTS  -jar mydemo-1.0.0-SNAPSHOT.jar

为了便于查看当前进程运行情况,这里就不跑在后台,直接打印在当前窗口上。

4.下面是正常监控情况:堆和元数据区都是64MB,线程栈是1MB,开启了远程监控端口8899

gc正常

资源占用正常

业务访问正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT学术优化推荐(gpt_academic )

GPT学术优化 (GPT Academic):支持一键润色、一键中英互译、一键代码解释、chat分析报告生成、PDF论文全文翻译功能、互联网信息聚合GPT等等 ChatGPT/GLM提供图形交互界面,特别优化论文阅读/润色/写作体验,模块化设计,支持自定义快捷按钮&…

014_用vim复制粘贴_保持双手正位

[oeasy]python0014_用vim复制粘贴_保持双手正位 继续运行 🥊 回忆上次内容 程序员 还是 很可爱的 要关心 身边的程序员 啊 毕竟是新时代的 典型新职业 文明 主流职业 血型 渔猎采集文明 猎人 O 游牧文明 牧民 B 农业文明 农民 A 工业文明 工人 商…

Linux——DNS的配置和使用

一、DNS 域名服务器,实现IP和域名的转换 DNS 协议运行在 UDP 协议之上,使用端口号 53 2.结构 DNS 的命名空间的结构如下: 1. 根域名( Root Domain ): 根域名位于 DNS 命名空间的顶部,它表示…

【继承和多态】

闭上眼睛,什么都不听.............................................................................................................. 文章目录 前言 一、【继承】 1.1【继承的概念】 1.2【 继承的定义】 1.2.1【定义格式】 1.2.2【继承关系和访问限定符】 1.2…

浏览器的同源策略与解决跨域

同源策略(协议、域名、端口) 同源策略(Same-Origin Policy)是一个在浏览器安全模型中被实施的重要安全机制。它是基于域名、协议和端口号的限制,用于防止不同源的网页间的恶意行为和信息泄露。 根据同源策略&#xf…

探秘Java线程:从概念到实践

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

Unity Timeline学习笔记(4) - 自定义轨道OnCreateClip和CreateTrackMixer用法上的区分

前面我们第二篇文章Unity Timeline学习笔记(2) - PlayableTrack是一个初步的PlayableTrack使用方法,有时候可能会个性化定制专属轨道。 OnCreateClip的例子 下面我们做一个例子: 首先是轨道 //FeatureTrack.cs using System.ComponentModel; using U…

以太网口硬件知识分享

一、了解网口通信基本原理 实现网络通信实质上是PHY与MAC及RJ45接口实现信号传输。MAC 就是以太网控制器,MAC属于数据链路层,主要负责把数据封装成帧,对帧进行界定实现帧同步。对MAC地址和源MAC地址及逆行相应的处理并对错误帧进行处理。PHY…

JavaScript-3(内置对象+数组对象+字符串对象)

目录 1.预解析 2.对象 什么是对象 创建对象的三种方法 利用字面量创建方法 利用new Object创建对象 构造函数创建对象 new关键字 遍历对象 3.内置对象 Math对象 Math概述 Math随机数 Date日期对象 格式化日期 Date总的时间毫秒 4.数组对象 创建数组的两种方式…

进销存单机版和excel进销存那个好用

进销存单机版和EXCEL进销存哪个好用?单机版是安装在单台电脑上使用的,它不能像网络版一样可以多台电脑同时共享数据,所以进销存单机版有一个优势就是不需要连接网络也可以使用。 进销存单机版 进销存软件单机版是经过开发人员设计好的一种信…

网页提示语闪太快的定位问题(selenium)

selenium UI自动化时,提示语闪太快,导致无法获取元素的问题 解决办法 步骤一: F12---》控制台输入debugger 步骤二:对于需要定位的部分,在控制台的debugger处回车,可以定住页面 步骤三:正常定…

生成式AI原理技术详解(一)——神经网络与深度学习

本文主要介绍了生成式AI的最新发展,提到了GPT-5和AI软件工程师在行业中的影响,指出AI技术进步对国家竞争和个人职业发展的潜在影响。 未来已来 最近有两则新闻: sam altman自曝GPT-5细节,公开宣称GPT-5提升将非常大,任…

62、回溯-N皇后

思路: N皇后问题要求在一个nn的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。 1、初始化数据结构…

Docker 入门篇(二)-- Linux 环境离线安装

引言 docker 系列文章: Docker 入门篇(一)-- 简介与安装教程(Windows和Linux) 一、安装环境准备 centos :CentOS Linux release 7.6.1810 (Core)docker 版本:docker-26.1.0.tgz 官网下载地址…

Linux驱动开发——(七)Linux阻塞和非阻塞IO

目录 一、阻塞和非阻塞IO简介 二、等待队列 2.1 等待队列头 2.2 等待队列项 2.3 将队列项添加/移除等待队列头 2.4 等待唤醒 2.5 等待事件 三、轮询 四、驱动代码 4.1 阻塞IO 4.2 非阻塞IO 一、阻塞和非阻塞IO简介 IO指的是Input/Output,也就是输入/输…

十个案例学习Flume

在上一篇文章中,已经知道了Flume的架构、概述、与安装,现在我们来用十个案例去学习flume的使用。 在使用之前,提供一个大致思想,使用Flume的过程是确定scource类型,channel类型和sink类型,编写conf文件并开…

零基础HTML教程(30)--迈入HTML5新时代

文章目录 1. 从H4时代到H5时代2. 属性值可以不用引号3. 标签使用大小写均可4. 部分属性值可以省略5. 浏览器支持情况6. 小结 1. 从H4时代到H5时代 之前讲的29篇HTML教程,内容基本都是H4时代就有的。 随着时代的发展,H4多少有点不够用,所以H…

Kotlin基础​​

数据类型 定义变量 var表示定义变量,可以自动推导变量类型,所以Int可以不用写。 定义常量 条件语句 if表达式可以返回值,该值一般写在if里的最后一行 类似switch的用法 区间 循环 a是标签,可以直接break到标签的位置&#xf…

【八大排序(二)】选择排序与堆排序

❣博主主页: 33的博客❣ ▶️文章专栏分类:八大排序◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多排序知识 目录 1.前言2.选择排序2.1基本思想2.2画图理解2.3单向选择排序代码实现2.4双向选择排序代码…

从零入门区块链和比特币(第一期)

欢迎来到我的区块链与比特币入门指南!如果你对区块链和比特币感兴趣,但不知道从何开始,那么你来对地方了。本博客将为你提供一个简明扼要的介绍,帮助你了解这个领域的基础知识,并引导你进一步探索这个激动人心的领域。…