首页 > 后端开发 > 正文

Java如何定位占用CPU比较高的问题

2024-06-07 01:52:28 | 我爱编程网

今天我爱编程网小编整理了Java如何定位占用CPU比较高的问题相关信息,希望在这方面能够更好的大家。

本文目录一览:

Java如何定位占用CPU比较高的问题

Java如何定位占用CPU比较高的问题

一、确定消耗CPU的Java进程

从上图可以看到Java进程 27459 消耗的CPU比较高。

二、查找 27459 Java进程消耗CPU线程ID

方式一: top -p [pid] 或 top -H -p [pid]

执行命令后按shift + h (显示进程各线程运行情况)

1)、top -p 27459

2)、shift + h

如下图:

方式二: ps -mp [pid] -o THREAD,tid,time

ps -mp 27459 -o THREAD,tid,time

方式三: pidstat -p [pid] -t 1

pidstat -p 27459 -t 1

备注:pidstat命令需要安装sysstat软件包。

从上面三种方式都可以看出PID是 27460的线程占用CPU比较高。

三、根据Java进程堆栈信息找到对应线程ID

3.1、对应线程ID转换成16进程 printf '%x\n' [tid]

27460 = 0x6b44

3.2、jstack [pid] 或 jstack [pid] |grep [tid] -A 30

jstack 27460 >> 27460.log

在27460.log文件中查找0x6b44对应的线程,如下图:

备注:

1、jstack 输出的堆栈信息,线程id对应的16进制为小写,查找时要统一按照小写方式查找

2、jstack输出为当前瞬间的堆栈信息,如果遇到间断性出现CPU高的问题时,需要多输出几次

从上面方式定位到代码Test.main(Test.java:4)处导致了CPU偏高的问题,那我们查看下代码具体如何实现的?我爱编程网

代码实现:

public class Test {

public static void main(String[] args) {

while(true) {

}

}

}

从代码层面看该处实现了一个死循环,所以导致了线程占用CPU偏高的问题。

Java如何定位占用CPU比较高的问题

Java进阶 Java应用程序中动态分配CPU资源[1]

Java的线程调度操作在运行时是与平台无关的 一个多任务系统需要在任务之间实现QoS(Quality of Service)管理时 如果CPU资源的分配基于Java线程的优先级 那么它在不同平台上运行时的效果是很难预测的 本文利用协调式多任务模型 提出一个与平台无关 并且能在任务间动态分配CPU资源的方案

现在 由于计算机系统已经从人机交互逐步向机机交互转化 计算机和计算机之间的业务对于时间的要求非常高 软件系统对于业务的支持已经不仅表现为对不同业务的逻辑和数据(算法+数据结构)支持 而且还表现为对同时处理不同任务的时效性 (任务响应速度)支持 一般 任务响应的速度可以通过算法优化及并行运算分担负载等手段来提高 但是 用户业务逻辑的复杂度决定了算法优化的发挥空间 硬件规模决定了所能够承担负载的大小 我们利用Java平台的特点 借鉴协调式多任务思想 使CPU资源能够在任务间动态分配 从而为时间要求强的任务分配更多的CPU运行资源 这也可以充分利用现有硬件 为用户业务提供最大的保障

用Java解决问题

本着软件系统结构和现实系统结构一致的思想 开发复杂业务服务的程序一般按照计算机任务和现实业务对应的思路 最终形成一个大规模的多任务系统 由于其跨平台性 Java系统可以随着业务的扩大 平滑地升级到各种硬件平台上 由于 Java自身的发展及其应用场合的不断扩大 用它实现多任务系统已经成为当前的应用方向 在J EE(Java Enterprise Edition)推出以后 Sun公司已经将Java的重心放在了服务器端(Server Side)系统的构造上 由于客户/服务器模型固有的多对一的关系 服务器端程序也必然是一个多任务系统

在Java多任务应用中 动态地将CPU资源在任务间分配有很重要的意义 比如一个 Internet服务商的系统往往有多种任务同时运行 有HTTP FTP MAIL等协议的支持 也有商务 娱乐 生活 咨询等业务的服务 在白天 网站希望系统的CPU资源尽量保障网上用户的服务质量 提高电子商务等任务的响应速度;晚上则希望让自己的娱乐服务和资料下载尽可能满足下班后人们的需要 另外 在新兴的网管(比如TMN Telemunication Management Neork)等应用领域中 服务程序往往需要支持成千上万个并发响应事件的被管理对象(MO Managed Object) 对于被管理对象执行的操作 不同用户在不同时刻往往有不同的时间要求

方案选择

在考虑动态分配CPU资源的实施方案时 往往有以下两点要求

须充分利用现有硬件资源 在系统空闲时 让低优先级任务也能够得到系统所能给予的最快响应

当硬件资源超负荷运行时 虽然系统中有大规模 多数量的任务不能处理 但它不应受影响 而能够顺利处理那些能够被处理的 最重要的高优先级任务

多任务系统要用多线程实现的最简单方法就是将线程和任务一一对应 动态调整线程的优先级 利用线程调度来完成CPU资源在不同任务间动态分配 这种思路在以前使用本地化代码(Native Code) 充分利用特定硬件和操作系统技巧的基础上是基本可行的 但在跨平台的Java环境中 这个思路对仅有小规模任务数的简单系统才可行 原因有以下两点

lishixinzhi/Article/program/Java/hx/201311/27234

Java如何定位占用CPU比较高的问题

怎么确定是否java程序一直只占用两个cpu 而不是同时利用48个cpu?

是的,你判断的没有错,任务管理器---详细信息---JAVA程序点右键----设置相关性里,你分配下CPU内核,对比下就知道了。2个内核没有跑满,软件又没有优化的好,结果就是堵着1-2个内核使劲跑,其他内核全程打酱油了。狠常见的,毕竟多线程编程更复杂些,成本也更高。

以上就是我爱编程网小编给大家带来的Java如何定位占用CPU比较高的问题全部内容,希望对大家有所帮助!

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“Java如何定位占用CPU比较高的问题”相关推荐
Java中CPU占用过高问题如何解决
Java中CPU占用过高问题如何解决

Java中CPU占用过高问题如何解决方法11.jps获取Java进程的PID。2.jstackpid>>java.txt导出CPU占用高进程的线程栈。3.top-H-pPID查看对应进程的哪个线程占用CPU过高。4.echo“obase=16;PID”|bc将线程的PID转换为16进制,大写转换为小写。5.在第二步导出的Java.txt中查找转换成为1

2024-06-01 04:31:35
如何用Python比较两个字符串的长度?
如何用Python比较两个字符串的长度?

如何用Python比较两个字符串的长度?题主你好,先说下解题重点:首先要知道被比较的两个字符串长度不一定是相等的,所以要先计算出str1和str2的长度,然后取较短的那个作为循环的次数,如果取较长的那个作为循环产数的话,在超出较短的那个字符串的索引后会出现Outofrange异常,从而使程序不能正确执行.其它的就没有太多需要注意的了.代码如下:-----测试结果如下

2023-12-23 15:11:57
python种如何输出指定位小数
python种如何输出指定位小数

python种如何输出指定位小数方法一:round(X,N)该方法并不严格有效,当X小数位数n<N时,仅能够输出n位小数。方法二:print('%.Nf'%X)或者print("%.Nf"%X)注意该方法有两个“%”,没有“,”。方法三:print(format(X,'.Nf')或者print(format(X,".Nf")注意该方法没有"%",但有“,”。更多

2023-12-12 23:54:15
Java为什么比C++慢?以及如何提高Java效率
Java为什么比C++慢?以及如何提高Java效率

java同样的代码windows下很慢原因在于java是运行在jm虚拟机里面,属于解析语言,所以java启动速度和运行速度都非常慢。java的唯一优点就是开发比较方便,开发界面程序一般用c++或c#或其它,很少人用java的,java那个运行效率真的太垃圾了,内存回收机制垃圾,程序响应慢,体积大就是java的最大缺点。Java为什么比C++慢?以及如何提高Java效率j

2024-05-28 12:57:26
如何用python编程解释“鸡兔同笼”问题?
如何用python编程解释“鸡兔同笼”问题?

用Python从键盘输入一个有中文和英文的字符串,编程分别输出中文和英文,并统?fromstringimportascii_lettersx=input("输入字符串:")hz=[]zm=[]forxxinx:ifxxin([chr(j)forjinrange(19968,40867)]):hz.append(xx)print(f"汉字:{xx}")eli

2023-12-28 20:54:29
用python怎么实现两个整数的比较呢?
用python怎么实现两个整数的比较呢?

python比较三个数大小并输出最大值?为了比较三个数的大小并输出最大值,我们可以使用以下Python代码:a=float(input("请输入第一个数:"))b=float(input("请输入第二个数:"))c=float(input("请输入第三个数:"))ifa>=banda>=c:print("最大值为:",a)elifb>=aandb&

2024-01-09 23:51:29
用netbeans运行java项目,出现下面的问题,求高手解答Activation.main: 怎样用netbeans运行java程序
用netbeans运行java项目,出现下面的问题,求高手解答Activation.main: 怎样用netbeans运行java程序

用netbeans运行java项目,出现下面的问题,求高手解答Activation.main:NetBeans的默认端口是8080,你是不是在其他的服务器上用的也是8080端口,服务器例如:Tomcat,你要装的是Tomcat,你就在Tomcat\conf目录下,找到server.xml,查找port,然后把它的端口改成其他的,就行了netbeans运行java程序缺省安装好以后应该什

2024-03-25 13:02:41
哪位高手能告诉我怎么使用notepad++,我用来编译Java程序的
哪位高手能告诉我怎么使用notepad++,我用来编译Java程序的

用notepad++编的代码怎样运行第一步,下载Notepad++,找到PluginManager。插件--->PluginManager--->showPluginManager。如图所示:第二步,安装NppExec插件。NppExec插件是Notepad++自带的,默认没有安装。现在安装一下。如果没有可以去网上下载。(注:我这里已经安装了,所以看不到)如图所示:

2024-04-04 09:33:22