3

テキストとして受け取り、Java Compiler API を使用して実行時にコンパイルする関数の CPU およびメモリ空間での効率を測定できるようにする必要があるプロジェクトがあります。

実行時間を測定するために ThreadMXBean を使用しています。より良い/より正確な方法はありますか?

ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

私が必要としているのは、使用されているメモリを測定する方法についてのアドバイスです。理想的には、すべての割り当てとそのサイズについて知りたいです。しかし、コードで使用される正確なバイト数で問題ありません。

すべてのコードを自動的にコンパイル、テスト、実行、評価する必要があります。したがって、プロファイラーを使用して自分自身を調べることはオプションではありません。あなたが私に指摘する可能性のある提案、可能な方法、リソース、またはツールは大歓迎です.

その点を明確にする必要があります。これは 1 回限りのプロセスではありません。これは、実装された機能をオンザフライで受信、コンパイル、分析、スコアリングする Web アプリの主要なサービスです。ピックでは、数百の同時ジョブが進行していると予想されます。外部ツールを使用して 1 回または手動で監視するプロセスは、私の目標ではありません。

私は繰り返します:私はこれをしたいです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 に答える