首页 > 编程语言 >Java 什么操作会导致cpu过高 java应用cpu过高原因

Java 什么操作会导致cpu过高 java应用cpu过高原因

时间:2024-03-28 16:13:37浏览次数:23  
标签:1287 Java 0.00 100.00 过高 Allocation Failure cpu 85.160

  1. top获取占用CPU高的进程ID
    top
    进程pid=26850

top显示信息,需要关注的相关信息:

  • load average:反映了任务队列的平均长度。如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高
  • %us:用户CPU时间百分比。如果此值过高,可能是代码中存在死循环、或是频繁GC等
  • %sy:系统CPU时间百分比。如果此值过高,可能是系统线程竞争激烈,上下文切换过多,应当减少线程数
  • %wa:等待输入输出CPU时间百分比。如果此值过高,说明系统IO速度过慢,CPU大部分时间都在等待IO完成
  • %hi:硬件中断CPU百分比。当硬件中断发生时,CPU会优先去处理,例如网卡收包会产生硬件中断,会优先处理
  • swap used:被使用的swap。内存不住时才会用到,此值过高代表系统因为内存不足而导致频繁的换入、换出操作,这样会影响效率,应增大内存量
  • %CPU:进程使用CPU的百分比
  1. top -H -p 获取进程中线程信息
    或top 然后H
    top -H -p 26850
    得到3个高消耗的线程PID:
    26857
    26853
    26855

3.获取最高的线程pid(十进制->十六进制)

点击查看代码
[root@localhost ~]# python -c "print hex(26857)" 

 0x68e9 

 或 

 [root@localhost ~]# printf "0x%x \n" 26857 

 0x68e9  

 [root@localhost ~]#

4.查看线程堆栈信息 jstack <进程PID> |grep <线程PID> 
可以结合grep参数 -A,-B,-C,控制限制关键字之前、之后、前后 N行
查看对应的堆栈信息,找到可能存在问题的代码
通过jstack,可以查看某个进程的当前线程栈运行情况,定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等

点击查看代码
jstack 26850 |grep 0x68e9 



 [root@localhost ~]# jstack 26850 |grep -A20 0x68e9  

 "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007fc190025800 nid=0x68e9 runnable  



 "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007fc190027800 nid=0x68ea runnable  



 "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00007fc190029800 nid=0x68eb runnable  



 "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00007fc19002b000 nid=0x68ec runnable  



 "VM Periodic Task Thread" os_prio=0 tid=0x00007fc19021c000 nid=0x68f6 waiting on condition  



 JNI global references: 322 



 [root@localhost ~]#
发现线程耗CPU高,主要在GC回收处理。
  1. pstack:可以查看某个进程的当前线程栈运行情况
    pstack 进程ID
  2. jstat查看gc情况
点击查看代码
[root@localhost ~]# jstat -gc 26850  1000  5 

  S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT    

 903680.0 903680.0  0.0    0.0   904192.0 904192.0 5423104.0  5423017.1  97792.0 92193.5 11520.0 10002.9   1287   85.160  694  7247.812 7332.972 

 903680.0 903680.0  0.0    0.0   904192.0 904192.0 5423104.0  5423017.1  97792.0 92193.5 11520.0 10002.9   1287   85.160  694  7247.812 7332.972 

 903680.0 903680.0  0.0    0.0   904192.0 904192.0 5423104.0  5423017.1  97792.0 92193.5 11520.0 10002.9   1287   85.160  694  7247.812 7332.972 

 903680.0 903680.0  0.0    0.0   904192.0 904192.0 5423104.0  5423017.1  97792.0 92193.5 11520.0 10002.9   1287   85.160  694  7247.812 7332.972 

 903680.0 903680.0  0.0    0.0   904192.0 821434.1 5423104.0  5423017.1  97792.0 92193.5 11520.0 10002.9   1287   85.160  694  7256.763 7341.923 

 [root@localhost ~]#  

 [root@localhost ~]#  

 [root@localhost ~]# jstat -gcutil 26850  1000  5  

   S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    

   0.00   0.00 100.00 100.00  94.28  86.83   1287   85.160   696 7263.066 7348.226 

   0.00   0.00 100.00 100.00  94.28  86.83   1287   85.160   696 7263.066 7348.226 

   0.00   0.00 100.00 100.00  94.28  86.83   1287   85.160   696 7263.066 7348.226 

   0.00   0.00 100.00 100.00  94.28  86.83   1287   85.160   696 7263.066 7348.226 

   0.00   0.00 100.00 100.00  94.28  86.83   1287   85.160   696 7263.066 7348.226 

 [root@localhost ~]#
7.jstat -gccause 查看信息
点击查看代码
[root@localhost ~]# jstat -gccause 26850 1s 

   S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                  

   0.00   0.00  90.21  99.99  94.31  86.88   1287   85.160   800 8246.108 8331.268 Allocation Failure   No GC                

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.31  86.88   1287   85.160   801 8246.108 8331.268 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.33  86.90   1287   85.160   802 8254.123 8339.284 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.33  86.90   1287   85.160   802 8254.123 8339.284 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.33  86.90   1287   85.160   802 8254.123 8339.284 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.33  86.90   1287   85.160   802 8254.123 8339.284 Allocation Failure   Ergonomics           

   0.00   0.00 100.00  99.99  94.33  86.90   1287   85.160   802 8254.123 8339.284 Allocation Failure   Ergonomics           

 ^C[root@localhost ~]#
8.为何如此频发gc,继续定位哪里占用内存 jmap -histo[:live] [pid] 把程序的对象情况打印出来 打印每个class的实例数目,内存占用,类全名信息。VM的内部类名字开头会加上前缀”*”。:live可选参数,用来指定只统计活的对象数量。 如果要dump下来的话,用命令:jmap -dump:format=b,file=mydump.dat jmap -histo:live | less

num #instances #bytes class name


1:     110988441     2663722584  com.xxx.demo.proc.ChangeEntry$RowValue 

2:      24670473     1012841688  [B 

3:       4155237      653276216  [Ljava.lang.Object; 

4:      16442770      526168640  java.sql.Timestamp 

5:      12352444      296458656  java.lang.Long 

6:       8422230      259114432  [C 

7:       8418832      202051968  java.lang.String 

8:       8241076      197785824  java.lang.Double 

9:       4111117      164444680  java.math.BigInteger 

10: 4110711 164428440 java.math.BigDecimal

11: 4214003 106784312 [I

12: 4125711 99017064 java.util.ArrayList

通过代码定位,发现:
com.xxx.demo.proc.ChangeEntry这个类对象太多了,大量占用内存。

标签:1287,Java,0.00,100.00,过高,Allocation,Failure,cpu,85.160
From: https://www.cnblogs.com/sjkzy/p/18101954

相关文章

  • top命令找到占用CPU最高的java线程
    1、使用jps查找正在运行的java进程2、通过使用top命令查找该线程下CPU使用最高的线程top-Hppid:即  top-Hp2860 3、TIME列就是各个Java线程耗费的CPU时间,显然CPU时间最长的是ID为2968的线程,用printf"%x\n"2968可得到2968的十六进制值为:b984、终于轮到jsta......
  • Java项目:77 springboot母婴商城
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍本课题后端使用SpringBoot+SpringCloud框架,前端采用html,JQuery,JS,DIV+CSS技术进行编程,设计在线商城。系统具有前台和后台两大服务。前台主要有用户登录注册、浏览商品、......
  • (毕业设计)基于Java+Vue+Mysql的网上订餐系统
    前言:网上订餐系统是一个综合性的在线服务平台,旨在为用户提供便捷的点餐、支付、配送等一体化服务。下面是对系统列出的各个功能模块的详细解释:一、个人中心个人中心是用户登录后的主要界面,展示用户的个人信息、订单记录、优惠券、积分等。用户可以在此查看并管理自己的账户......
  • (毕业设计)基于Java+Vue+Mysql的大学生租房平台
     前言:大学生租房平台是一个专门为大学生提供租房服务的在线平台。这个平台不仅简化了租房流程,还提供了多种功能,如房源搜索、在线沟通、合同签订等,让大学生能够轻松、安全地找到适合自己的房源。以下是针对系统列出的七个平台功能的详细解释:一、个人中心个人中心是用户在使......
  • (毕业设计)基于Java+Vue+Mysql的学生心理咨询评估系统
     前言:学生心理咨询评估系统是一个集成了多个功能模块的综合性系统,旨在为学生提供心理咨询服务和评估。以下是对系统的五个主要功能模块的详细解释:一、个人中心个人中心是用户的个人空间,主要用于展示和管理用户的基本信息、心理评估记录、咨询历史等。学生可以在这里查看自......
  • java基础操作4——计算三维空间两点之间的绝对距离
    在实际项目中,计算两个坐标点的距离算是比较常见的问题。具体可参考如下文章:https://blog.csdn.net/w10463672p/article/details/136877796但是涉及到三维空间的距离计算,或者准确说是两点的相似度,需要用到欧式距离算法或者其他数学方法。此算法计算的距离衡量的是多维空间中......
  • SAP Fiori开发中的JavaScript基础知识1 - 背景介绍
    1.背景开发SAPFiori应用程序过程中,不可避免的要用到JavaScript去增强或影响UI的行为。对于传统ABAPer,JavaScript的语言特性和风格与ABAP是有较大的不同的。接下来的一段时间,我会尝试整理在SAPFiori开发过程中会常用到的一些JavaScript基础知识,并结合介绍在SAPBAS中开发Fio......
  • SAP Fiori开发中的JavaScript基础知识2 - 变量,操作符,值,类型
    1.JavaScript代码示例在介绍JavaScript具体语法前,让我们先看一段在Web应用程序过程中的JS代码片。<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>FirstJavaScriptApplication!</title> <scriptsrc="js/myExternal.js&q......
  • hbase - [04] java访问hbase
     需要导入jar包$HBASE_HOME/lib下的所有jar包$HADOOP_HOME/share/hadoop/common的所有jar包 packagecom.harley.hbase.test;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.NamespaceDescriptor;importorg.apache.hadoop.hbase.Tabl......
  • JavaWeb学习笔记——第七天
    MySQL(二)数据库查询-DQLDQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录。关键字:SELECT语法关键字和参数说明select字段列表基本查询from表名列表where条件列表条件查询groupby分组字段列表分组查询having分组后条件列......