WINDOWS下分析JAVA进程中非常耗用CPU资源的代码1.【内容说明】本文主要介绍怎么在WIN系统下,分析占用CPU较高的JAVA进程,定位到代码。2.【问题现象】WIN系统,任务管理器中监控到java进程耗用CPU时间太长,如图所示:进程号为:1153043.【分析思路】用pslist工具看一下进程下的线程信息:(附pslist工具,绿色直接运行:),也可以用ProcessExplorer工具查询线程ID。在所有线程中,有一个线程处于“运行状态”,且执行了3分多种,如下:线程ID为75004(这里是十进制),转换成十六进程值为:124FC,124FC即为线程ID。所有内存值单位均为KB.•Pri:Priority•Thd:NumberofThreads•Hnd:NumberofHandles•VM:VirtualMemory•WS:WorkingSet•Priv:PrivateVirtualMemory•PrivPk:PrivateVirtualMemoryPeak•Faults:PageFaults•NonP:Non-PagedPool•Page:PagedPool•Cswtch:ContextSwitches接下来根据124FC线程ID定位到线程堆栈:运行命令:jstack115304>D:\AnalyseThread.log,把当前所有线程堆栈输出到存储:打开存储文件,检索线程ID=124FC的堆栈:根据线程堆栈定位到代码:问题原因:在主函数中调用了一个compute函数,函数参数如果为true,则会陷入死循环(模拟业务耗时操作)。解决方案:调整逻辑,解除死循环。4.【扩展】以上是在windows下从发现进程到分析到jvm线程代码的过程。我在写这个示例程序的过程中,在程序运行的状态下,我做了一个dump,生成了一个dump文件:javaw.DMP。用windbg分析当前dmp文件,简要分析如下。查看当前java进程所有线程,发现线程号为1的线程ID为124fc(前面定位到的耗时的线程号):切换到线程号为1的线程:查看当前线程堆栈:说明:以上堆栈是nativecode的堆栈,我在代码中调用了IO输出流系统方法,这时是以native代码(非JVM之上的java堆栈)的显示方式,如果看懂可能需要更多的知识,要对windowsnativecode熟悉才可以,建议用前面第3小节讲的方法。补充一下运行原理:1.不管是JVM还是.netframework,我们可以理解为它是操作系统的适配器,只是.netframework只适配windows,而JVM可以适配windows也可以适配linux;2.用C#或JAVA写的代码只是我们便于理解,windows或linux操作系统不认识,它们只认识机器码,这就需要.netframework和JVM框架来把我们写的代码转换成操作系统能够识别的机器码。