在没有三方工具的情况下,如何对java程序进行性能调优呢?答案很简单,利用操作系统提供的一些功能和jdk自带的一些工具,就可以完成一些基本的性能调优,比如,在linux 下,可以用 top,sar, vmstat 命令查看一些进程,内存以及cpu的信息。当然window 下也有相应的东西,比如任务管理器,性能监控工具。这里主要讲一次window下的调优。
任务管理器,就不用多说了,用过window 的人基本都知道。它能对计算机系统的整体运行情况进行监控,暴多CUP,内存,以及网络使用情况。
但事实上,在window下用perfmon 是性能监控更强大的工具.它不仅可以针对计算机整体情况进行监控,更能对某一个具体的进程,具体的线程进行监控.基本上所有的东西,都在它的监控范围内.
你可以通过在开始菜单 运行 对话框中输入 "perfmon" 命令来启动它,也可以在"控制面板"中的"管理工具"中找到 “性能” ,双击打开.
底部的表格显示了正在监控的对象,可以通过右键点击,添加计数器。
一般情况下,我们关注这几项就足够了: process 进程,processor 处理器 ,thread 线程. 这里用一个例子来测试。找出消耗cpu最多的线程.public class HoldCPUMain {
public static class HoldCPUTask implements Runnable{
@Override
public void run() {
while(true){
double a=Math.random()*Math.random();
}
}
}
public static class LazyTask implements Runnable{
public void run(){
try{
while(true){
Thread.sleep(1000);
}
}catch(Exception e){
}
}
}
public static void main(String[] args){
new Thread(new HoldCPUTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
}
}
运行之后,我们设置监控对象为 Thread, 并选择 java.exe 进程中的所有线程.
发现线程id:3020 最耗CPU资源。
利用jdk 自带工具,比如:
将 3020 转换成 16进制 就是 BCC, 因此,在刚才 jstack 命令中 的结果中去找 nid = BCC 的线程,救过发现如下:
于是可以清晰的看到是那一个类中的那一个方法最耗资源。当然,这只是简单的方法去测试性能,在大多数情况也足够用了,当然,如果想更好的监控性能,可以采用三方工具,比如virtual vm 或者 jprofile 等专业的工具,以后有时间再测试.