如何找到占用CPU和内存最高的线程

2024-06-07 13:38

本文主要是介绍如何找到占用CPU和内存最高的线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

title: 如何找到占用CPU和内存最高的线程

date: 2017-03-01

tags: java


一、如何找到CPU和内存占用最高的线程

  1. 代码示例

    我们先来写一段代码

    @Testpublic void testLinuxTop() throws  Exception{boolean b=true;System.out.println("start the cpu Thread");while (b){int i=(int)Math.random()*1000;if (i%3==1){}if (i==1000){System.out.println("stop");b=false;}}}

    随便写了个死循环,然后怎么看下CPU占用情况呢?

    TOP命令

    先用ps -ef|grep tomcat查看一下你当前tomcat的进程号,比如我看出来我的进程号是8545

    然后用TOP命令查看当前所有进程

    top -p 8545
    top -p 8545 -H //这样也可以

    使用地址中,进入了下面这个界面之后就要按H了

    于是你就会看到下面这张图片

    这里写图片描述

    CPU占用接近满了,内存占用30M,怎么会占用这么多?OK,我们记住PID 8545

  2. jstack命令

    OK,我们在栈里面来找出这段代码,可以直接用jstack把栈里面的东西打出来

    直接使用下面的就可以

    jstack 8545 > stack.log 在你的当前目录下面就会出现一个stack.log文件,这是包括所有的栈信息的,这里的8545是tomcat的进程号tomcat的进程号tomcat的进程号,重要的事情强调一下

    如何找到有问题的代码呢?

    我们刚才拿到了一个CPU最高的进程号8545,OK,转化为16进制,使用下面命令

    printf "%x\n" 8545
    //或者
    printf 0x%x 8545 

    上面两种都可以拿到16进制的8545,或者你自己去用计算器拿去,这里我们得到的是0x2162或者2161(上面一种可以直接拿到2161,没有0x),我们要的就是2161

    可以直接到jstack.log文件里面去搜索,就看到出问题的代码了

  3. 想直接看

    下面提供一种直接看的方法

    jstack 8545|grep -A 30 2162

    得到线程堆栈信息中2162这个线程所在行的后面30行

  4. question

    4.1 我使用jstack pid报错了怎么办?

    使用jstack pid可能会出现8545 operation permitted之类的错误,解决办法,请切换至root用户执行命令

  5. over

这篇关于如何找到占用CPU和内存最高的线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039336

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

tomcat端口被占用如何解决

转载:https://www.cnblogs.com/demon09/p/9248445.html

逆向学习汇编篇:内存管理与寻址方式

本节课在线学习视频(网盘地址,保存后即可免费观看): ​​https://pan.quark.cn/s/3ceeb9ae6d98​​ 在汇编语言的世界中,内存管理和寻址方式是构建程序的基础。理解这些概念不仅对于编写高效的汇编代码至关重要,也是进行逆向工程分析的关键技能。本文将深入探讨内存管理的基本原则和多种寻址方式,并通过代码案例来展示它们的实际应用。 1. 内存管理 内存管理涉及如何分配

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,

段,页,段页,三种内存(RAM)管理机制分析

段,页,段页         是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。 段 段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。 段实现的虚拟地址 = 段号+offset 物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if