You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码、库或工具统计Java方法的CPU性能占比?

如何统计Java单个方法的CPU占用百分比(非耗时)

需求是统计单个方法消耗的CPU容量占总CPU性能的百分比(不是方法执行耗时),比如某个方法运行时占用5%的总CPU性能,这完全可以通过工具、库或代码实现,以下是具体方案:

一、工具方案(推荐,精度高、低侵入)

这类工具通过采样或字节码注入的方式统计方法CPU占比,无需修改业务代码:

  • JProfiler:专业性能分析工具,可实时监控方法的CPU使用率占比,支持按方法维度查看CPU时间占总CPU时间的百分比,还能关联调用链。
  • VisualVM:JDK自带的免费工具,切换到"采样器"或"剖析器"标签,选择CPU分析,就能看到每个方法的CPU时间占总采样时间的比例,直接换算为百分比。
  • AsyncProfiler:轻量级低开销采样工具,能生成火焰图,直观展示各方法在CPU时间中的占比,适合生产环境使用。

二、代码级实现(侵入式,适合自定义统计)

可以借助Java的ThreadMXBean API获取线程CPU时间,结合系统总CPU时间计算方法的CPU占比。核心思路是:记录方法执行前后的线程CPU时间和系统总CPU时间,用线程CPU时间差除以系统总CPU时间差,得到该方法的CPU占用百分比。

示例修改(以你的add方法为例):

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public void add(int seed, int number) {
    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    // 获取当前线程CPU时间(纳秒)
    long threadCpuStart = threadMXBean.getCurrentThreadCpuTime();
    // 获取系统总CPU时间(所有核心,纳秒)
    long systemCpuStart = ManagementFactory.getOperatingSystemMXBean().getProcessCpuTime();

    try {
        random = new Random(seed); 
        int i = 0;
        while (i < number){
            collection.add(random.nextInt());
            i++;
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

    long threadCpuEnd = threadMXBean.getCurrentThreadCpuTime();
    long systemCpuEnd = ManagementFactory.getOperatingSystemMXBean().getProcessCpuTime();
    
    long threadCpuUsed = threadCpuEnd - threadCpuStart;
    long systemCpuUsed = systemCpuEnd - systemCpuStart;
    
    // 计算占比(注意处理除零情况)
    double cpuPercent = systemCpuUsed == 0 ? 0 : (double)threadCpuUsed / systemCpuUsed * 100;
    System.out.printf("add方法CPU占用百分比: %.2f%%\n", cpuPercent);
}

注意:代码级实现会引入一定性能开销,且多线程场景下需要更复杂的线程隔离处理,精度不如专业工具。

你提供的相关代码

ArrayListCollection类

package collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;


public class ArrayListCollection<T> extends MyCollections {

    public ArrayListCollection() {
        super.collection = new ArrayList<T>();
    }

    public void add(int seed, int number) {
        try {
            random = new Random(seed); 
            int i = 0;
            start = System.currentTimeMillis();
            while (i < number){
                collection.add(random.nextInt());
                i++;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        end = System.currentTimeMillis();
    }
    
     public void remove(int seed, int number) {
        try {
            random = new Random(seed);
            int i = 0;
            start = System.currentTimeMillis();
            while (i < number){
                collection.remove(random.nextInt());
                i++;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        end = System.currentTimeMillis();
    }

    public void contains(int seed, int number) {
        try {
            int secondSeed = seed + 100;
            ArrayList list = arrayList(seed, secondSeed, number);
            int i = 0;
            start = System.currentTimeMillis();
            while (i < number){
                collection.contains(list.get(i));
                i++;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        end = System.currentTimeMillis();
    }
 
}

Main类

package collections;

import java.util.Random;


public class Main {

    public static void main(String[] args){
      
        int number = Integer.parseInt(args[0]);
        int seed = 200;
        
        ArrayListCollection arrayList = new ArrayListCollection();
        
       //ArrayList collection Add
        System.out.print("Add " + number + " elemrnt(S) to ArrayList .... ");
        arrayList.add(seed,number);
        System.out.print(" Done .... ");
        System.out.println("The estimated Time: " + arrayList.estimatedTotalTime() + "\n");       
         
          //ArrayList collection Contains
        System.out.print("Search " + number + " elemrnt(S) in ArrayList .... ");
        arrayList.contains(seed, number);
        System.out.print(" Done .... ");
        System.out.println("The estimated Time: " + arrayList.estimatedTotalTime() + "\n");
         
         //ArrayList collection Remove
        System.out.print("Remove " + number + " elemrnt(S) from ArrayList .... ");
        arrayList.remove(seed, number);
        System.out.print(" Done .... ");
        System.out.println("The estimated Time: " + arrayList.estimatedTotalTime() + "\n");    
    }
}

内容的提问来源于stack exchange,提问作者steven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:10:59