Java进程cpu占用过高问题解决
作者:陈晓呆 发布时间:2021-08-09 00:16:59
cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%;我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束。
产生CPU100%的原因:
某一程序一直占用CPU是导致CPU100%的原因,大概有以下几种情况:
1、Java 内存不够或溢出导致GC overhead问题, GC overhead 导致的CPU 100%问题;
2、死循环问题. 如常见的HashMap被多个线程并发使用导致的死循环, 或者死循环;
3、某些操作一直占用CPU
第一步:使用top命令,查看占用cpu的进程
[root@sdfsdfseZ codeimage]# top
第二步:ps -ef | grep java 或jps命令,找出服务器的所有java进程
第三步:找出CPU耗用最厉害的进程pid
第四步:查找出具体占用cpu利用率最厉害的线程号,top -H -p pid 。然后按下shift+p,跳出CPU监控
当前线程号为:1747
第五步:将获取到的线程号转换成16进制
因为java线程栈文件中的线程id是十六进制,需要将线程id从十进制转为十六进制。十进制 转十六进制的命令如下:
结果为:
第六步:导出线程栈
将具体的占用CPU过高的java进程的线程栈导出,导出命令如下:
pid.tdump文件后缀名随意,通常以tdump结尾。
[root@sdfsdfsdeZ codeimage]# jstack 1747 > tmp/1747.tdump
可能会抛出异常;
1747: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
原因分析
jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.
检查了/tmp/hsperfdata_root目,,但在$TOMCAT_HOME目录中的temp目录中有对应的文件.
解决办法
使用
[root@iZ2zeab8t820b5ywp0rkfeZ bin]# jstack 1706 > /tmp/hsperfdata_root/1706.tdump
第七步:导出堆
[root@sddsdfsaZ bin]# jstat -gcutil 1706
第八步:jvisualvm分析快照使用JAVA_HOME/bin/jvisualvm.exe,载入快照
文件----->载入—>文件类型(Dump)
来源:https://www.cnblogs.com/winson-317/p/12684942.html


猜你喜欢
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基
- 1 概述Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java
- spring-retry是什么?spring-retry是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提
- 背景在Java中一个回调的操作是一个在一些操作完成之后被传递到另一个函数中并且被执行的函数。一个回调函数既可以被同步或者异步执行。在一个同步
- 本节了解一下 SpringBoot 中 Web 开发的静态资源导入和首页设置,对应 SpringBoot-03-Web 项目。1. 静态资源
- 一、题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种
- 本文实例讲述了Android编程中沉浸式状态栏的三种实现方式。分享给大家供大家参考,具体如下:沉浸式状态栏Google从android ki
- 查询返回Map<String,Object>类型mybatis 查询返回Map<String,Object> 类型,
- equalsIgnoreCase() 方法用于将字符串与指定的对象比较,不考虑大小写。实例equals() 会判断大小写区别,equalsI
- 本文实例讲述了Java获取时间年、月、日的方法。分享给大家供大家参考。具体实现方法如下:package com.date.demo; imp
- 0x01 新建SpringBoot项目1. 新建maven工程ps:在上一教程的基础上操作,就不用新建项目了,请参考文章:SpringBoo
- 本文实例讲述了Android编程实现左右滑动切换背景的方法。分享给大家供大家参考,具体如下:最近想做一个左右滑动切换背景图片的应用,特地将自
- @Cacheable自定义KeyGenerator1. 概述SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指
- 前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。由于网络波动而重复提交的例子也比
- 带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码。生成的二
- 了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以
- 文章描述可能我标题描述不太准确,所以还是要稍微解释下:横线样式就是将TextBox以一条底横线的形式展示在页面,占位提示就是Web的Plac
- 上下文:程序运行需要的环境(外部变量)上下文切换:将之前的程序需要的外部变量复制保存,然后切换到新的程序运行环境系统调用:(用户态陷入操作系
- 首先需要明白一点,只有scop为(singleton)单例类型的Bean,spring才支持循环依赖。scope为(prototype)原型
- 表达式目录树表达式目录树:语法树,或者说是一种数据结构1.表达式目录树Expression:System.Linq.Expressions;