虚拟机给每个线程分配的内存(栈空间)是由虚拟机参数-Xss来指定的,在不同平台上对应的默认大小可以 在oracle的官方文档上查询到:-X Command-line Options
其中,Linux64位默认Xss值为256K,并非1M或10M,因为windows本身的一些限制导致,在4G的windows上线程最多也就开到300多。一个Java进程可以启动的线程数可以通过如下公式计算:
(系统剩余内存 - 最大堆容量Xmx - 最大方法区容量MaxPermSize)/ 最大栈空间Xss

1.使用 top -p <pid> 命令(<pid>为Java进程的id号)查看Java进程的cpu占用:

  该Java进程占用cpu达到92.2%。

  2.使用 top -Hp <pid>  命令(<pid>为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)此处按照cpu排序:

  

  可以看到,有两个线程号为97243,97912的线程占用cpu分别达到了69.2%和22.0%

  3.使用 printf "%x\n" <tid>  命令(tid指线程的id号)将以上10进制的线程号转换为16进制:

  

  转换后的结果分别为17bdb,17e78,由于16进制以0x开头,所以对应的16进制的线程号为0x17bdb和0x17e78。

  4.使用dk自带命令jstack获取此时的线程快照并输入到文件中: jstack -l <pid> > ./jstack_result.txt 命令(<pid>为Java进程的id号)来获取线程快照结果并输入到指定文件。

  5.查看第4步生成的txt文件,在其中搜索tid为0x17bdb的线程:

  

  可以看到线程号为0x17bdb(10进制线程号97243)对应的是一个"VM Thread"即虚拟机线程,这个不是与我们代码相关的线程,所以暂时忽略。

  再看0x17e78线程:

  

  该线程的堆栈较深,且很明显有调用我们自己代码的逻辑,并且提示了具体的代码行数,我们查看该处代码:

  

  发现此处是在一个死循环里边重复的拼接字符串导致的,我们知道,String类使用contact方法拼接字符串其实是创建新的对象并返回,看到这里,似乎可以和占用cpu最高的"VM Thread"联系起来了,因此作出假设:由于代码一直循环创建对象,导致不断有不再被引用的对象产生,虚拟机检测到对象不再被引用之后,就进行垃圾回收,垃圾回收占用了很大一部分cpu资源。

  为了证明该假设,设置jvisualvm监控,经过一段时间允许,cpu资源监控结果如下:

  

  可以看到cpu总占用达到88.5%,而垃圾回收活动占用cpu达到84.0%,因此证明了上述假设。

  知道了该问题的原因后,我们还想知道此时垃圾回收的频率,耗时等信息,于是可以设置JVM参数 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log (或者使用jinfo命令动态设置GC日志,可参考http://www.importnew.com/15722.html),可以看到日志内容:

  

  gc.log中频繁的打印垃圾回收,不过我们看到的基本都是Minor GC,即新生代的垃圾回收。

  为了更清晰的查看各个区的垃圾回收情况,可以使用jstat命令 jstat -gc <pid> <period> <count>  (pid为Java进程的id,period指每次监控之间的时间间隔,count指监控次数)来监控垃圾回收,打印内容如下:

  

  可以看到,虚拟机在进行频繁的Full GC,每次耗时均在增长。

  总结:

  分析Java进程占用cpu过高问题时候,基本都可以按照如下步骤进行分析:

  (1)使用 top -Hp <pid> 命令找出进程中占用cpu最高的前几个线程

  (2)使用jstack获取线程快照,然后使用线程id搜索分析快照文件

  (3)如果线程调用了业务相关代码,则分析是否是代码问题导致的cpu占用过高,如果线程是VM Thread,则应该监控检查垃圾回收活动频率,看是否是因为频繁进行垃圾回收导致的。

Java虚拟机六:Java进程占用cpu过高问题分析 - 码农大卫 - 博客园

Java项目服务器cpu占用100%解决办法相关推荐

  1. cpu占用100_Java项目服务器cpu占用100%解决办法

    1.使用命令top查看cpu进程,发现tomcat占用cpu使用率过高 可以看到服务器负载很高,tomcat CPU使用已达到接近300%,内存20%. 2.把进程的栈dump到文件里,以便后面的分析 ...

  2. Java项目服务器cpu占用过高怎么办?

    借用汤师爷的一句话:"麻匪一定要缴---没有麻匪的日子才是好日子". 作为程序员,bug一定是要处理的,没有bug的日子才是好日子!你想想,你正吃着火锅唱着歌,突然收到生产环境异常 ...

  3. idea2021.3CPU占用100%解决办法

    最近安装了idea2021.3版本,在启动运行一段时间后感觉电脑非常卡,打开任务管理器后发现cpu占用一直在100%,查看进程是被idea占用的,试了很多网友的办法后没有解决,每次启动idea一段时间 ...

  4. 电脑磁盘占用100%解决办法

    解决办法 在几年前的Win7时代,用户已经不需要频繁的进行碎片整理操作,Win8/Win8.1/Win10亦如此,但是却有新的问题出现了,硬盘占用率成为了一个十分严肃的问题.在搭载了Windows8/ ...

  5. linux systemd-logind 进程cpu占用100% 解决方法

    刚开始远程工作,就接到短信告警,系统CPU占用过高,立即登录系统查看,登录的过程异常缓慢,不过总算登录了 ABRT报告发现了一个问题 ABRT是一个自动汇报错误的工具,主要是为用户提供简洁的,全面的错 ...

  6. linux snap 进程cpu占用100% 解决

    过程如下: df -iayll@yll-ubuntu:/snap/snapd$ df -ia 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 sysfs 0 0 0 - /sys ...

  7. php进程导致服务器cpu占用100%问题追查过程

    今天早上,zabbix服务器监控突然发出报警,提示CPU占用过高. 以下为追查原因的过程,做此记录,方便遇到同样问题的朋友进行排查 查看占用cpu高的进程 使用top命令找出cpu占用过高的进程,如图 ...

  8. 服务器cpu占用100%,如何排查问题?

    一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...

  9. Windows 10磁盘占用100%解决办法

    开机后磁盘占用高,是因为 windows 10 默认启用了 superfetch 服务.   这个服务的主要功能是加快程序的启动速度.开机以后,系统将那些经常使用的程序,预先从硬盘加载到内存中,这样, ...

  10. 谷歌浏览器 lass CPU 占用高解决办法

    C:\Users\Administrator\AppData\Roaming\Microsoft\Protect  剩下的看着办吧·· 转载于:https://www.cnblogs.com/chen ...

最新文章

  1. 矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法 | ICML 2021
  2. 深度学习卷积神经网络大事件一览
  3. 从你输入一个网址,到网页显示,其间发生了什么?
  4. java生产问题快速定位_生产环境如何快速跟踪、分析、定位问题-Java
  5. 队列读取器代理 遇到错误 Row handle is invalid
  6. ORACLE的sign函数和DECODE函数
  7. 动态规划算法-04最长递增子序列问题
  8. Bash Shell学习笔记三
  9. (百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏
  10. 服务器换完主板后无盘进不了系统,更换主板后主板认不出硬盘无法进入系统的办法 – 手机爱问...
  11. Asp.Net 导出数据格式为Excel 数据的9种方案
  12. 如何使用Visual Studio创建SQL Server数据库项目
  13. 内存中的堆和栈(heap stack)
  14. mixin风格的bases class
  15. 绘制自己组合的k线图_史上最全K线图大全:搞懂70种K线组合形态,轻松低买高卖不踏空...
  16. javascript调试 debugger 代码调试
  17. 《Redis开发与运维》笔记-复制
  18. 解决vmware16安装win7时安装不了vmtools
  19. 米勒-拉宾素数检测法(判断一个极大的数是否为质数)——算法解析
  20. 全角字符空格(可复制使用)

热门文章

  1. OSPF之NSSA区域
  2. 设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转
  3. HTTP协与Apache服务的搭建
  4. WDR7660虚拟服务器,tp-wdr7660设置wps方法_tp-wdr7660怎么设置wps-硬件之家
  5. 随机分组c语言,用C/C++进行随机分组的实现教程
  6. 人均GDP将破1万美元对中国意味着什么?
  7. 神经网络测试样本的选择,如何测试神经网络模型
  8. 2022考研数二解答题规范给分(17,18,19,22)
  9. 哪吒票房超复联4,100行python代码抓取豆瓣短评,看看网友怎么说
  10. qt 导出word中插入图片