精华内容
下载资源
问答
  • 在程序开发的过程中,难免遇到进程占用cpu过高(现网居多、开发环境)的情况,现网出现这种情况就需要及时的能定位问题,快速解决,否则就导致系统不可用,用户投诉等多种一系列的问题。 2、java进程占用CPU过高...

    java进程爆cpu的快速定位

    1、背景

    在程序开发的过程中,难免遇到进程占用cpu过高(现网居多、开发环境)的情况,现网出现这种情况就需要及时的能定位到问题,快速解决,否则就导致系统不可用,用户投诉等多种一系列的问题。

    2、java进程占用CPU过高常见的两种情况:

    • 代码中有死循环或者接近死循环的操作
    • 快速创建大量临时变量,导致频繁触发gc回收

    3、在windows中的定位方法

    如图所示:
    在这里插入图片描述
    用jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线程分别占用的cpu。
    在这里插入图片描述

    在这里插入图片描述

    所以在windows平台上要找出到底是哪个线程占用的cpu还不那么容易,linux用top就行了。

    3、定位步骤:

    3.1、找到java进程对应的pid。

    找pid的方法是:打开任务管理器,然后点击 “查看” 菜单,然后点击 “选择列”,把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。
    (也可以用第三步中提到的工具直接查看),在win10详细信息里面直接可以看到pid值。
    在这里插入图片描述
    在这里插入图片描述

    3.2.然后把java进程导出快照。直接运行命令。

    在这里插入图片描述

    找到导出的文件打开d:/jstack182880.stack文件。
    在这里插入图片描述

    3.3、在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,这里用的是微软提供的 Process Explorer v15.3

    下载地址:点击这里下载

    下载完后解压运行

    找到cpu占用高的线程,双击显示如图,或者右键点击需要查看的进程—properties
    在这里插入图片描述

    3.4.然后选择 Threads 选项卡,找到占用cpu的线程的tid,比如我这里是 224664 的线程

    这里我们可以发现有多个线程占用7%左右,导致cpu占用较高
    在这里插入图片描述

    3.5.把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。

    3.6.在 d:/jstack182880.stack文件中查找 36d98

    在这里插入图片描述

    找到相关代码,定位出问题所在。
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4、在linux中的定位方法

    4.1.找到CPU占用高的进程号 如:使用top命令查看(可以使用其它方法,只要找到对应的进程号即可)

    在这里插入图片描述

    注:图中第一列PID为进程号;

    4.2、根据进程号找到CPU占用高的线程

    如:使用命令top -H -p (其中要换成第一步找到的进程号)
    在这里插入图片描述

    注:图中第一列PID此时为线程号;

    4.3.导出java进程执行堆栈,并找到对应的线程

    使用jstack > jstack_xxx.txt (其中要换成第一步找到的进程号)
    从第二步中的PID中找出一个CPU占用高的线程号,把它转成16进制,比如3261转成CBD
    从导出的堆栈信息里找到nid为cbd的线程堆栈
    在这里插入图片描述

    4.4:从堆栈里找到对应的代码执行类和方法

    若代码为业务代码,则需要具体分析代码,找出代码中死循环或接近死循环的地方,并修正;定位结束;
    在这里插入图片描述

    若堆栈信息为gc线程(类似下图),则需要进行下一步

    4.5:dump出java进程的堆对象使用情况

    使用jmap -histo > jmap_xxx.txt
    在这里插入图片描述

    找出量比较大的、且跟业务有关的对象,找到这些对象创建的地方进行分析;一般需要持续创建大量的对象,使得内存不够用时,才会频繁触发gc进行回收,gc回收时jvm有停顿,CPU也占用很高。

    线程之间的切换,是很耗费性能的,所以带来CPU飙升.
    新生代设置过小,也会频繁触发gc。有大对象始终根节点路径可达,无法释放,jvm在疯狂的Full GC。

    展开全文
  • nova-conductor单个进程占用CPU 100%

    千次阅读 2015-01-22 15:41:44
    nova-conductor单个进程占用CPU 100%

         nova-conductor进程在运行时,其中单个进程会周期性的占用CPU 100%的使用率,周期大约2分钟。经调试和排查,发现原因在于nova-conductor在执行某一数据库操作时,请求数据量巨大, 仅数据库查找耗时10s,返回数据大小在2MB。导致数据在进行序列化和解序列化时耗尽CPU,并持续时间较长。详情如下:

         操作请求:object_class_action

         请求参数:{u'objver': u'1.6', u'objmethod': u'get_by_filters', u'args': [{u'deleted': True, u'soft_deleted': False, u'host': u'node-144}], u'objname': u'InstanceList', u'kwargs': {u'use_slave': True}

         功能:根据host信息查询该计算节点上所有已删除实例的信息,注意这里获取instance数据库信息的filter的deleted=True。这里是获取node-144计算节点上所有已删除实例的数据库信息,执行时间140.429696083s,此间CPU利用率基本处于100%。随着openstack系统的持续运行,数据库中的删除虚拟机信息将会越来越多,该数据查找操作也会继续变大,CPU耗时也将越长。node-144上进行创建删除的虚拟机较多,所以查询的时间最长,占用CPU 100%的时间也最长,对于其它计算节点上的InstanceList查询会持续在10s左右。


    请求者: nova-compute

         执行该请求的函数(不完全统计):

    •   _run_pending_deletes (定时任务,默认3m执行一次)
    • _cleanup_running_deleted_instances(定时任务,默认30m执行一次)

    建议:
             定期清理数据库!

    展开全文
  • Windows进程的内存占用以及CPU占用

    千次阅读 2019-03-05 10:04:02
    Windows进程的内存占用以及CPU占用 2016年05月25日 19:09:52chen_aotian阅读数:3988 版权声明:本文为博主原创文章,...在测试过程中,有时我们需要关注某个进程的内存占用CPU占用、句柄数等情况,在Windows...

    Windows进程的内存占用以及CPU占用

    2016年05月25日 19:09:52 chen_aotian 阅读数:3988

     版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen_aotian/article/details/51500898

    在测试过程中,有时我们需要关注某个进程的内存占用、CPU占用、句柄数等情况,在Windows系统中,使用windows自带的性能监视器可以达到目的。

     

     

    使用方法

    1. 运行“perfmon”,打开性能监视器;
    2. 新建自定义的数据收集器集;

     

       3. 选择“手动创建”,下一步

       4. 勾选“性能计数器”,下一步

       5. 点击“添加”

       6. 左上窗口选择process下的working set,左下窗口选择对应的进程,点击添加,会添加到右侧窗口中

       7. 重复6的步骤,将process下的processor time和handle count一次添加

       8. 一直下一步,直至完成

       9. 右键刚才新建的数据收集器集,启动,即开始采集数据

       10. 一段时间后,右键停止

       11. 右键新建的数据收集器集,点击“最新的报告”查看报告

      12. 报告如下图

     

     

    说明

    1. Processor Time是指CPU的占用百分比
    2. Working Set是指内存占用
    3. Handle Count是指句柄数
    展开全文
  • 都知道可以在任务管理器中查看进程CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取 CPU 和内存占用呢? .NET 中提供了 PerformanceCounter 类型,可以用来监视系统中大量的性能问题。 本文内容获取...

    都知道可以在任务管理器中查看进程的 CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取到 CPU 和内存占用呢?

    .NET 中提供了 PerformanceCounter 类型,可以用来监视系统中大量的性能问题。


    获取全局 CPU 和内存占用

    要获取到全系统中的 CPU 占用率,获取全系统中内存占用,需要首先分别创建这两者的性能计数器:

    // 创建对 CPU 占用百分比的性能计数器。
    var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    // 创建内存占用字节数的性能计数器
    var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
    

    接下来,使用 NextValue() 可分别获取到两者的值:

    float cpu = CpuCounter.NextValue();
    float ram = RamCounter.NextValue();
    

    你需要注意的是,我们在创建 PerformanceCounter 时,构造函数中传入的参数是固定的,或者说必须跟当前系统中安装的计数器的计数器类别的名称(categoryName,第一个参数)和计数器的名称(counterName,第二个参数)对应。另外,如果某个类别包含单个实例,那么需要传入实例名称(instanceName,第三个参数)。

    获取当前进程的 CPU 和内存占用

    在了解的 PerformanceCounter 各个参数代表的含义之后,我们还可以获取到单个进程的性能计数。

    var name = Process.GetCurrentProcess().ProcessName;
    var cpuCounter = new PerformanceCounter("Process", "% Processor Time", name);
    var ramCounter = new PerformanceCounter("Process", "Working Set", name);
    

    也是使用 NextValue() 来获取到此性能计数器实例的值。

    这里,我们在计算单个进程的内存占用时,使用的是工作集大小,这个值会比较接近我们平时使用任务管理器看到的物理内存占用的大小,但是我们还有其他可以查询的类别:

    • Private Bytes
      包含进程向系统中申请的私有内存大小,不包含跨进程中共享的部分内存。
    • Working Set
      进程占用的物理内存的大小。由于包含共享内存部分和其他资源,所以其实并不准;但这个值就是在任务管理器中看到的值。
    • Virtual Bytes
      进程在地址空间中已经使用到的所有的地址空间总大小。

    参考资料


    我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

    如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • 系统lsass.exe进程占用cpu的解决

    万次阅读 2017-12-20 10:13:55
    一、打开浏览器出现lsass.exe进程占用一个cpu核心100%。 二、lsass.exe进程是微软为Windows?操作系统定义的系统进程,存在于基于Windows NT的系统,如Windows 2000/Xp/2003/Vista系统中。其描述为:LSA Shell ...
  • 1、top:观察占用CPU或者MEN(内存)使用情况最高的进程,记录PID; TIP: (1)、“1” 显示出多个逻辑CPU使用情况; (2)、“X” 高亮显示CPU列,并排序,"Z"红色展示; (3)、“shift + &...
  • *记录开发中的问题,方便以后自已...adb shell 输 入 top 查看系统资源,发现 CPU占用率节节升高.我的去。* 最终发现是线程没有关闭,而不停的创建新的线程 ,private class TrackThred extends Thread { private byte
  • 很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因。 1、找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占用内存最高的10个进程 ps aux | ...
  • 进程阻塞为什么不占用cpu资源

    千次阅读 2019-07-03 15:29:54
    阻塞是进程调度的关键一环,指的是进程在等待某事件(如接收网络数据)发生之前的等待状态,recv、select和epoll都是阻塞方法。 如下面所示一段服务端server的代码: #!/usr/bin/python # -*- coding: UTF-8 -*...
  • 在虚拟机上的ubuntu系统,java程序创建了多个java子进程,查看cpu信息时发现,主进程的java占用cpu一直在百分之九十几,有时超过100%,这是为什么呢?如图。 ubuntu是4核的![图片说明]...
  • 进程占用CPU 100%时可能中的病毒

    千次阅读 2007-04-14 08:47:00
    进程占用CPU 100%时可能中的病毒 system Idle Process 进程文件: [system process] or [system process] 进程名称: Windows内存处理系统进程 描 述: Windows页面内存管理进程,拥有0级优先。 介 绍:该进程作为单线程...
  • 今天断断续续的收到管理平台的异常报警,cpu占用过高和jvm old占用过高,这个时候赶紧去排查原因,下面记录了我的排查过程,可能里面还有不正确的地方,欢迎各位大佬指正,也欢迎大家关于类似的案例一起交流,下面就...
  • 使用Process Explorer可以很方便查看某个进程各个线程的CPU占用率,可以为排查问题提供帮助。我使用的Process Explorer版本是v16.21 64bit。使用VS 2008创建一个MFC对话框程序,在代码中创建两个线程,如下: m_...
  • 1.获取内存占用信息 获取步骤: (1)获取当前进程句柄 使用GetCurrentProcess(),返回一个当前进程的句柄   (2)定义一个保存内存信息的结构体 PROCESS_MEMORY_COUNTERS pmc; 结构体定义如下: typedef ...
  • 以上这些信息应该是比较全面的了,在Win32 API里为我们提供了PSAPI(进程状态)和ToolHelp32这两种探测系统进程/线程信息的方式,在Windows2K/XP/2003都支持它们。 现在,我们来看看系统的性能信息,性能结构SYSTEM...
  • 发现服务器异常,一般先想到用top命令查看占用CPU高的进程,但如果是高手入侵,可能会替换掉你系统的一些重要命名。所以建议装系统后,把诸如/usr/bin目录的top、ps、kill等重要命令先备份好。一旦发现被入侵,先...
  • 如何得到本进程CPU占用率? Zz

    千次阅读 2008-05-27 14:09:00
    win32 API并没有提供直接得到CPU占用率的函数,但提供GetProcessTimes()函数可以得到进程占用的CPU时间,通过和实际时间的流逝相比,可以得到某进程占用CPU的比率。好了,下面就是完整的C++代码。// 得到当前进程的...
  • 如何计算当前进程CPU占用

    千次阅读 2009-03-27 17:21:00
    由于测试一个解码器的项目,很长时间都在反复进行domain knowledge的学习,再加上自己是一个测试新手,对于测试代码撰写啥的还很是生嫩,前一阵被要求在性能测试中,最好在测试时能够计算出解码进程CPU占用率,做...
  • #coding=utf-8 import time import psutil import pymysql # 先安装两个包psutil和pymysql # 在mysql创建数据库test1,...create table memory_and_cpu(cpu_lv varchar(100),memory_lv varchar(100),pro_cpu_lv va...
  • 本节介绍如何查看哪些进程占用了较多的CPU,这些进程代表的含义,后续哪里着手深入定位。 AIX当中,通常可以topas实时查看哪个进程消耗了较多的CPU。类似的,linux当中可以通过top命令查看。 ...
  • 程序(进程)在cpu中的执行过程

    万次阅读 多人点赞 2018-09-30 10:59:10
    2.等待cpu调度此程序,也即是获取cpu的使用权 3.运行balabala... 那我fork一个进程又是什么回事??? 复制与当前程序(进程)一模一样的资源与代码???丢到进程调度队列那里去,让它有...
  • 进程从创建到结束的状态

    千次阅读 2019-08-10 17:13:58
    linux内核中的函数sched()称为调度器,它会根据各种参数来选择一个等待的进程去占用cpu,当进程占用了cpu后,就就绪态转变成了执行态。此时进程可以运行了,但是运行时间有一个限制,即“时间片”的概念。当时间片...
  • 如何得到本进程CPU占用率?

    千次阅读 2008-05-16 10:21:00
    因为是多线程程序,在几百上千个线程同时加载脚本的时候,千军万马过独木桥,往往导致极大的CPU开销,比较好的办法就是在每个加载线程内对CPU占用进行判断,如果占用率小于某个值,就继续运行,否则就Sleep(),等候...
  • 1.ld-linux-x86-64进程占用CPU 90%,用户为oracle。 2.手工kill掉过一会还会再出现。 排查过程 1.切换oracle用户,su - oracle 2.查看定时任务,crontab -e,发现有如下定时任务 /home/oracle/.cac...
  • 一次GC线程占用系统CPU过高处理过程

    千次阅读 2018-12-12 20:18:52
    因为测试人员报告说,最近订单系统总是超时,要重启才能恢复正常,但是第二次复现的时间不固定。 然后先是查看下应用状态是否正常,没有问题。...发现订单应用的CPU已经100%,但是内存还有剩余,内存占用 大概30...
  • win2003新安装环境下cpu 50%以上,导致机器很卡,发现是mscorsvw.exe在作祟 服务里面去查找,发现有两个服务NGEN,其中2.0被禁用,估计是4.0的影响, 关闭ngen 4.0后,cpu下来了。 Microsoft ...
  • JAVA 进程异常高的 CPU 占用

    千次阅读 2010-08-10 12:42:00
    问题描述  系统管理员或用户注意 JAVA 进程消耗大量的 CPU 资源,  并想要了解是哪个方面消耗了大量 CPU 资源,以及导致出现这种现象的原因。   故障排除  请注意,并非下面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,122
精华内容 68,848
关键字:

从创建进程到占用cpu的过程