iphone网站,郑州做互联网推广的,胶州市经济技术开发区建设局网站,找外贸客户的网站#x1f4eb;作者简介#xff1a;小明java问道之路#xff0c;2022年度博客之星全国TOP3#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化#xff0c;文章内容兼具广度、深度、大厂技术方案#xff0c;对待技术喜欢推理加验证#xff0c;就职于… 作者简介小明java问道之路2022年度博客之星全国TOP3专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化文章内容兼具广度、深度、大厂技术方案对待技术喜欢推理加验证就职于知名金融公司后端高级工程师。 热衷分享喜欢原创~ 关注我会给你带来一些不一样的认知和成长。 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家 如果此文还不错的话还请关注、点赞、收藏三连支持一下博主~ 文末获取联系 精彩专栏推荐订阅收藏 专栏系列点击解锁 学习路线点击解锁 知识定位 Redis从入门到精通与实战 Redis从入门到精通与实战 围绕原理源码讲解Redis面试知识点与实战 MySQL从入门到精通 MySQL从入门到精通 全面讲解MySQL知识与企业级MySQL实战 计算机底层原理 深入理解计算机系统CSAPP 以深入理解计算机系统为基石构件计算机体系和计算机思维 Linux内核源码解析 围绕Linux内核讲解计算机底层原理与并发 数据结构与企业题库精讲 数据结构与企业题库精讲 结合工作经验深入浅出适合各层次笔试面试算法题精讲 互联网架构分析与实战 企业系统架构分析实践与落地 行业最前沿视角专注于技术架构升级路线、架构实践 互联网企业防资损实践 互联网金融公司的防资损方法论、代码与实践 Java全栈白宝书 精通Java8与函数式编程 本专栏以实战为基础逐步深入Java8以及未来的编程模式 深入理解JVM 详细介绍内存区域、字节码、方法底层类加载和GC等知识 深入理解高并发编程 深入Liunx内核、汇编、C全方位理解并发编程 Spring源码分析 Spring核心七IOC/AOP等源码分析 MyBatis源码分析 MyBatis核心源码分析 Java核心技术 只讲Java核心技术 本文目录
本文导读
一、CPU利用率飙高问题
1、CPU利用率飙高定位步骤
2、CPU飙高的原因
3、CPU飙高的解决方法
二、内存飙高问题
1、内存飙高定位步骤
2、内存飙高故障分析及解决
2.1、进程占用太多的内存
2.2、缓存占用过高导致内存不足
2.3、内存泄漏和内存溢出
总结 本文导读
本文对CPU利用率飙高问题内存飙高问题进行剖析。主要内容有CPU利用率飙高定位步骤、CPU飙高的原因与解决内存飙高定位步骤以及内存飙高故障分析及解决。
一、CPU利用率飙高问题
1、CPU利用率飙高定位步骤
当cpu经常飙升到100%的使用率需要定位到具体是哪个线程在占用定位问题的步骤如下(linux系统)
1、使用top命令常看当前服务器中所有进程jps命令可以查看当前服务器运行java进程找到当前cpu使用率最高的进程获取到对应的pid
2、然后使用top -Hp pid查看该进程中的各个线程信息的cpu使用找到占用cpu高的线程pid。
3、使用jstack pid打印它的线程信息通过jstack命令打印的线程号和通过top -Hp打印的线程号进制不一样需要进行转换才能进行匹配jstack中的线程号为16进制而top -Hp打印的是10进制。
使用 jastack 命令分析线程信息的时候需要关注线程对应的运行状态runnable代表当前线程正在运行waiting代表当前线程正在等待该状态需要进行特殊关注wait fot 后面的线程号因为如果当前处于waiting状态的程序长时间处于等待状态那么就需要知道它在等待哪个线程结束也就是wait for后面的线程号然后根据线程号找到对应的线程去查看当前线程有什么问题。
2、CPU飙高的原因
1、无限循环或死循环程序中存在错误的循环结构导致程序一直在循环执行从而消耗大量的CPU资源。
2、复杂的算法和计算程序中执行复杂的算法、大规模的数据处理或者需要大量计算的操作可能导致CPU占用过高。
2、频繁的IO操作如果程序频繁地进行文件读写、网络通信等IO操作可能会导致CPU占用增加。
3、线程问题多线程程序中线程可能因为竞争条件、死锁、阻塞等问题导致CPU占用过高。
4、内存问题内存泄漏或内存占用过高可能导致Java虚拟机频繁进行垃圾回收从而增加CPU负担。
5、不合理的资源管理没有正确释放或管理资源如打开的文件、数据库连接等可能导致CPU占用过高。
6、第三方库或框架问题使用的第三方库、框架或组件可能存在性能问题导致程序CPU占用增加。
7、并发问题不正确的并发控制或同步机制可能导致竞争条件和性能问题。
8、缓存问题缓存未有效利用导致程序频繁地从内存或磁盘读取数据增加了CPU负担。
9、频繁的异常处理频繁的异常处理可能会导致CPU占用过高因为异常处理可能会涉及昂贵的堆栈跟踪等操作。
3、CPU飙高的解决方法
1、优化代码检查代码code review优化算法、循环和IO操作减少CPU负担。
2、线程管理确保多线程程序中的线程正确管理避免竞争条件和死锁。
3、内存管理检查内存泄漏确保释放不再使用的内存。
4、使用合适的工具使用性能分析工具来检测CPU占用过高的具体位置和原因。
二、内存飙高问题
内存飙高一般都是堆中对象无法回收造成因为java中的对象大部分存储在堆内存中。其实也就是常见的oom问题(Out Of Memory)。
查看内存状态的命令top、free、vmstatsar/proc/meminfo
导致内存不足的三个原因进行占用太高、缓存占用过高没有进行释放、内存泄漏和内存溢出导致内存不足
1、内存飙高定位步骤
1.jinfo pid可以查看当前进行虚拟机的相关信息列举出来
2.jstat -gc pid ms多长毫秒打印一次gc信息打印信息如下里面包含gc测试年轻代/老年带gc信息等
3.jmap -histo pid | head -20查找当前进程堆中的对象信息jmap -dump:formatb,filexxx pid可以生成堆信息的文件但是这个命令不建议在生产环境使用因为当内存较大时执行该命令会占用大量系统资源甚至造成卡顿。
在项目启动时添加下面的命令在发生oom时自动生成堆信息文件-XX:HeapDumpOnOutOfMemory。如果需要在线上进行堆信息分析如果当前服务存在多个节点可以下线一个节点生成堆信息或者使用第三方工具阿里的arthas。
2、内存飙高故障分析及解决
2.1、进程占用太多的内存
原因每当对磁盘进行读写操作时都会先对缓存进行操作因为缓存是需要消耗内存的虽然缓存中的内存会自动释放但是只有当物理空闲内存不够的时候缓存中才会释放一些内存出来释放的也仅仅是够用不会全部释放。
解决办法使用top命令查看哪个进程占用太多进行内存排序kill掉
2.2、缓存占用过高导致内存不足
同进程占用太多的内存处理
2.3、内存泄漏和内存溢出
内存泄漏程序在申请内存后无法释放会导致内存空间不足。
内存溢出程序申请内存时没有足够的空间供其使用出现内存溢出。解决检查错误日志修改JVM启动参数增加内存
内存溢出的原因内存中加载的数据过于庞大如一次从数据库读取过多的数据内存供给不足导致内存溢出集合类中有对对象的引用使用完后未清空使得JVM运行java代码的容器相当于一台java虚拟机不能回收代码中存在死循环或循环产生过多重复的对象实体启动参数内存设定的过小。
总结
本文对CPU利用率飙高问题内存飙高问题进行剖析。主要内容有CPU利用率飙高定位步骤、CPU飙高的原因与解决内存飙高定位步骤以及内存飙高故障分析及解决。