如何模拟FullGC导致CPU满载问题

news/2024/11/15 8:23:28/

系列文章目录

第一章 如何保证多个线程的顺序执行?

第二章 如何排查线上环境内存使用过大?

第三章 如何模拟FullGC导致CPU满载问题?


文章目录

    • 前言
    • 排查故障
      • 一、构建模拟环境
      • 二、Java VisualVM查看
        • 在命令行输入,启动VisualVM
        • 安装VisualGC插件
        • 查看内存分配情况
      • 三、模拟频繁Full GC
    • 解决思路
    • 额外


前言

面试时,经常会问到线上问题排查,诸如内存占用过大,cpu满载,服务器告警等问题,该文就来说一下cpu满载的问题。

造成CPU满载的主要原因有:

  • 频繁Full GC
  • 代码死循环
  • 线程死锁

下面就从第一个方面复现问题,后续会继续出其他情况的模拟

排查故障

一、构建模拟环境

创建springboot项目就省略了,上一章已经创建过,请参考!

配置VM options

-Xmx60m -Xms60m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCDateStamps
在这里插入图片描述

根据默认的分配比例(1:2)可以得到,年轻代:老年代=20M:40M

年轻代中根据-XX:SurvivorRatio=8,得到eden:s0:s1 = 16M:2M:2M

二、Java VisualVM查看

在命令行输入,启动VisualVM

jvisualvm
在这里插入图片描述

可以看到详细的配置信息,包含自己手动添加的VM options

安装VisualGC插件

在最上面找到工具–>插件,安装VisualGC
已安装

查看内存分配情况

在这里插入图片描述
可以看到内存分配情况,和配置参数是预测的一致,eden:s0:s1 = 16:2:2
young:old = 20:40

三、模拟频繁Full GC

模拟频繁Full GC 导致CPU瞬间满载,代码如下(示例):

@RestController@RequestMapping(value = "/memory")public class MemoryController {@GetMapping("/oom/{n}")public String oom(@PathVariable int n) throws InterruptedException {/*** 创建一个强引用的局部变量,执行完就回收*/List<byte[]> memoryList = new ArrayList<>();/*** 每次请求生成一个n M大小的空间*/memoryList.add(new byte[n * 1024 * 1024]);// 写一个sleep时间,让强引用时间长一点Thread.sleep(1000);return "success";}@GetMapping("/testCpu/{n}")public void testCpu(@PathVariable int n){// 模拟创建多个线程,每个线程创建一个10M的对象for (int i = 0; i < n; i++) {new Thread(()->{try {oom(10);} catch (InterruptedException e) {e.printStackTrace();}}).start();}}}

浏览器频繁调用 http://127.0.0.1:8080/memory/testCpu/100

会出现如下情况
CPU满载
CPU瞬间满载,垃圾回收也达到满值
日志频繁FullGC
日志一直在打印FullGC进行垃圾回收

可以发现频繁FullGC会在瞬间导致CPU满载,出现服务器告警或者无法提供服务的情况,如果由于当时用户量大量增加,就会导致服务无法使用的情况。

解决思路

合理调整JVM堆内存比例,防止对象直接进入老年代,导致老年代空间不足,频繁FullGC

额外

手写springboot+orm项目,有用的话还请star一下
https://github.com/AnswerYL/custom


http://www.ppmy.cn/news/491551.html

相关文章

什么软件测试cpu满载,截然相反!CPU满载压力测试

CPU满载压力测试 本项目采用ORTHOS软件使核心达到满载状态,模拟极端使用环境(运行大型游戏、软件时常会出现CPU满载的现象)。 Intel Core i5 2300满载运行6分钟后温度88℃ Intel Core i5 2300满载运行6分钟后CPU倍频会被自动减低至17x,CPU的主频为1.7GHz,相信是Intel的过热保…

python cpu_python 让cpu满载

python 让cpu满载 发布时间&#xff1a;2018-07-29 17:25:11编辑&#xff1a;admin阅读(5939) 搞zabbix监控的时候&#xff0c;linux服务器的负载很低&#xff0c;如何写一个python脚本&#xff0c;让它满载呢&#xff1f; 网上搜了一堆&#xff0c;发现各种不靠谱。后来终于发…

电脑cpu莫名占用满的解决方法有哪些呢?

cpu占用率高导致电脑卡的头疼。win10电脑CPU占用率高的原因很多&#xff0c;可能是某个程序占用率大&#xff0c;或者是某个系统服务所致&#xff0c;又或者是系统BUG导致。 更多重装系统教程尽在小白系统重装官网 ​ 方法一、结束进程 1、同时按下Ctrl、Alt和Del键。弹出操作…

数据库CPU满载如何处理

当数据库CPU满载时&#xff0c;我们首先要做的是让CPU降下来&#xff0c;优先保证系统的可用性。 什么情况会导致数据库CPU飙升呢&#xff1f; QPS过高&#xff1a; 高并发&#xff0c;也就是数据库承载的流量过大。慢SQL&#xff1a; 少量或大量慢SQL占用CPU资源&#xff0c…

Python数据类型转换函数大全

虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。 比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点类型 hei…

microsoft已过期

microsoft已过期 第一步&#xff1a;点击红色剪头&#xff0c;选择设置 第二步&#xff1a;点击&#xff1a;关于microsoft edge&#xff1b;等待更新&#xff0c;重启就行。

Oracle数据库如何解决账户过期的情况

相信很多小伙伴都遇到过这样的烦恼 小编也遇到过这样的情况&#xff0c;pL的注册过期&#xff0c;用不了了&#xff0c;十分的苦恼。 下面是小编的解决办法&#xff1a; 注册码&#xff1a; Product Code&#xff1a;4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz …

oracle密码已过期问题解决

首先我是oracle同步数据时候遇到的问题显示oracle密码已过期,提示如下: 解决方法如下: 1.查看是否配置过期&#xff1a;select * from dba_profiles where profile‘DEFAULT’ and resource_name‘PASSWORD_LIFE_TIME’; 2.设置永不过期&#xff1a; ALTER PROFILE DEFAULT …