码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • java线上CPU、内存打满处理


    java线上内存打满处理

    • 1.环境说明
    • 2.mac 启动jvisualvm
    • 3.模拟堆内存溢出
    • 4. JVM参数-XX:+HeapDumpOnOutOfMemoryError
    • 5.执行模块方法
    • 6.发现问题
    • 7.分析堆栈文件
    • 8.注意事项
    • 9.模拟栈内存溢出
    • 10.栈内存溢出报错
    • 11.模拟CPU打满
    • 12.CPU打满发现问题
      • 12.1步骤1
      • 12.2 步骤2
      • 12.3步骤3
    • 13.找出JVM中最耗cpu的线程
    • java 基础命令

    1.环境说明

    k8s、linux、docker、springboot、springcloud、 jdk1.8

    2.mac 启动jvisualvm

    直接输入jvisualvm

    jvisualvm
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    3.模拟堆内存溢出

    @GetMapping("/hello")
        public void getInfo2() throws InterruptedException {
    
            Set<MyObject> objects = new LinkedHashSet<MyObject>();
            objects.add(new MyObject());
            objects.add(new MyObject());
            objects.add(new MyObject());
            System.out.println(objects.size());
            while(true){
                objects.add(new MyObject());
                System.out.println(objects.size());
                Thread.sleep(100L);
            }
        }
    
        static class MyObject{
            //设置默认数组长度为99999更快的发生OutOfMemoryError
            List<String> list = new ArrayList<>(10000);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4. JVM参数-XX:+HeapDumpOnOutOfMemoryError

    在这里插入图片描述

    5.执行模块方法

    在这里插入图片描述

    注:当内存到达限制后,会进行内存堆栈的导出,所以这个方法执行会非常久(我配置是最大4G内存)

    在这里插入图片描述

    6.发现问题

    k8s 控制台执行如下命令

     kubectl -n lc top pods
    
    • 1

    在这里插入图片描述
    cpu和内存不断飙高,等服务报内存溢出后,直接去容器内部把堆栈文件下载下来。
    拷贝命令如下:

    cp lc/sx-system-deployment-58d67dbdd4-vdwc2:/sx/java_pid1.hprof /root/java_pid1.hprof
    
    • 1

    所在容器目录:

    在这里插入图片描述

    7.分析堆栈文件

    装入
    在这里插入图片描述
    在这里插入图片描述
    查找
    找到占用最大的对象
    在这里插入图片描述
    右键–》在实例视图中显示
    在这里插入图片描述
    找到问题代码
    在这里插入图片描述

    8.注意事项

    堆内存增长查看要用如下命令

    jmap -heap pid
    
    • 1

    在这里插入图片描述

    9.模拟栈内存溢出

    package test.oom;
    
    public class StackOOM {
        private int stackLength = 1;
    
        public void stackLeak() {
            stackLength++;
            stackLeak();
        }
    
        public static void main(String[] args) throws Throwable {
            StackOOM oom = new StackOOM();
            try {
                oom.stackLeak();
            } catch (Throwable e) {
                System.out.println("stack length:" + oom.stackLength);
                throw e;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    10.栈内存溢出报错

    在这里插入图片描述

    11.模拟CPU打满

        @GetMapping("/hello1")
        public void getInfo3() throws InterruptedException {
    
            CpuTest myThread1 = new CpuTest();
            CpuTest myThread2 = new CpuTest();
            CpuTest myThread3 = new CpuTest();
            CpuTest myThread4 = new CpuTest();
            myThread1.start();
            myThread2.start();
            myThread3.start();
            myThread4.start();
        }
    
    class CpuTest extends Thread {
            @Override
            public void run() {
                int i = 0;
                while (true) {
                    i++;
                }
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    12.CPU打满发现问题

    12.1步骤1

    方法1

    kubectl -n lc top pods
    
    • 1

    查看到CPU会飙到limits限制的临界点
    在这里插入图片描述
    方法2

    1.先在宿主机上使用top命令查出占用CPU高的进程id
    2.通过使用以下命令查出对应的容器

    docker ps -q | xargs docker inspect --format '{{.State.Pid}} {{.Name}}' | column -t|grep PID
    
    • 1

    12.2 步骤2

    查找到占CPU的线程
    方法1 利用arthas工具

    java -jar /opt/arthas/arthas-boot.jar
    
    • 1

    进入arthas 界面后,输入dashboard

    在这里插入图片描述
    在这里插入图片描述
    得到占CPU严重的是线程

    12.3步骤3

    方法1
    在arthas 中直接使用thread ID(该ID为上一步取得的id)
    在这里插入图片描述

    方法2
    通过spring boot admin 查看导致CPU 占满的代码
    在这里插入图片描述

    13.找出JVM中最耗cpu的线程

    除了用第12步骤的方法外,还可以用以下这种方法

    参考:找出JVM中最耗cpu的线程

    java 基础命令

    1.查询虚拟机运行参数信息。
    jinfo -flags pid 
    2.输出堆内存设置和使用情况(JDK11使用jhsdb jmap --heap --pid pid)
    jmap -heap pid
    3.用于输出运行主类的全名
    jps -l 
    4.生成堆栈快照
    jmap -dump:format=b,file=2020.dump pid
    
    5.查询虚拟机当前的线程快照信息
    jstack -l pid
    jstack -l pid >> 文件名
    6.从容器中拷贝文件到宿主机
    kubectl  cp lc/sx-system-deployment-58d67dbdd4-vdwc2:/sx/java_pid1.hprof /root/java_pid1.hprof
    7.通过pid 查找容器名称
    nsenter --pid --uts -t 145483  hostname
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

  • 相关阅读:
    Java | 类、实例初始化 、方法重写规则
    【Zookeeper】——服务器动态上下线监听案例&分布式锁案例
    再突破!阿里云进入Gartner云AI开发者服务挑战者象限
    tensorboard玩耍手册
    不会分布式?阿里p9架构师推荐分布式系统开发实战文档
    小程序的入门
    云原生Kubernetes:pod进阶之资源管理与探针
    【论文阅读】An Evaluation of Concurrency Control with One Thousand Cores
    Autosar诊断实战系列22-UDS单帧/长帧发送代码级分析
    XCZU19EG_FFVC1760芯片的封装和管脚
  • 原文地址:https://blog.csdn.net/shandian534/article/details/127390586
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号