3

我有一个项目,我需要能够测量 CPU 和内存空间的效率,这些函数作为文本接收并在运行时使用 Java Compiler API 进行编译。

我正在使用 ThreadMXBean 来测量运行时间。有更好/更准确的方法吗?

ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

我需要的是关于如何测量所用内存的建议。理想情况下,我想了解每项任务及其规模。但是我可以精确计算代码使用的字节数。

每一段代码都需要自动编译、测试、运行和评估。因此,使用 Profiler 并查看自己不是一种选择。欢迎您指出我的任何建议、可能的方法、资源或工具。

我需要说明这一点。这不是一次性的过程。它是网络应用程序的主要服务,可即时接收、编译、分析和评分已实现的功能。在挑选时,我预计会有 100 个并发作业在进行。使用外部工具进行一次或手动监控的过程不是我的目标。

我再说一遍:我想这样做as a service。它不是为了测试我的应用程序或分析它们。

我不咬人(或者因为我们在 SO 上投反对票),所以任何严肃的建议都会获得赞成票。

状态更新:这个项目被搁置,因为我没有可靠的方法来进行内存使用测量。我目前正在研究 JVM 世界之外的其他语言/框架也可以这样做。即便如此,我仍在积极寻求建议和研究这个项目。

4

2 回答 2

3

我认为使用ThreadMXBean是实现这一目标的最佳方式,您可以获得所需的所有信息。

我们正在使用此代码段来测量执行期间使用的最大内存:

    try {
        PrintWriter out = new PrintWriter(System.out);
        List<MemoryPoolMXBean> pools = ManagementFactory
                .getMemoryPoolMXBeans();
        for (MemoryPoolMXBean pool : pools) {
            MemoryUsage peak = pool.getPeakUsage();
            out.printf("Peak %s memory used: %,d%n", pool.getName(),
                    peak.getUsed());
            out.printf("Peak %s memory reserved: %,d%n", pool.getName(),
                    peak.getCommitted());
        }
        out.close();
    } catch (Throwable t) {
        System.err.println("Exception in agent: " + t);
    }

这是ManagementFactory用例的有用资源。

于 2013-08-09T15:20:23.513 回答
1

没有明确说明,但在您的问题中暗示所有功能都将在同一个 jvm 中运行。

尽管为每个函数启动一个单独的 jvm 会增加开销,但我会认真考虑这个选项 - 它会使测量内存和 cpu 使用率变得更加容易,因为您可以使用开箱即用的 mx bean 来收集每个 jvm 统计信息并将统计信息报告回控制过程。

您可能会发现您需要单独的 jvm 提供的隔离。

你能保证所提供的函数都不会导致无限循环吗?你能保证它们都不会耗尽所有可用内存或其他资源吗?单独的 jvm 将提供一个有效的沙箱。

于 2013-08-12T13:33:02.743 回答