このエンドポイントに投稿されたxmlデータを受信するサーブレットがあります。
xmlをjavaオブジェクトなどに変換しますが、このプロセス中のメモリ使用量を最小限に抑えたいと思います。
サーブレットにxmlデータを投稿するときに、メモリ使用量を分析し、物事がどのように変動するかを測定するための最良の方法は何ですか?
VisualVMはアプリの測定に最適で、ランタイムCPU情報、メモリ使用量、スレッドなどのさまざまな図を提供します。
トレースの場合、これは常にうまくいきました(コンソールに出力):
2013-01-05T22:52:13.954+0100:15918369.557:[GC 15918369.557:[defnew:65793K-> 227K(98304K)、0.0031220秒] 235615K-> 170050K(491520K)0.003220K) =0.00、実数=0.00 秒]
JMXを使用できます。
ヒープメモリ:
public String monitorMemory() {
StringBuilder sb = new StringBuilder("Memory:");
MemoryMXBean mmbean = ManagementFactory.getMemoryMXBean();
MemoryUsage hmu = mmbean.getHeapMemoryUsage();
sb.append("[HeapMemoryUsage:");
sb.append(" Used=" + formatBytes(hmu.getUsed()));
sb.append(" Committed=" + formatBytes(hmu.getCommitted()));
sb.append("]");
MemoryUsage nhmu = mmbean.getNonHeapMemoryUsage();
sb.append("[NonHeapMemoryUsage:");
sb.append(" Used=" + formatBytes(nhmu.getUsed()));
sb.append(" Committed=" + formatBytes(nhmu.getCommitted()));
sb.append("]");
return sb.toString();
}
メモリープール:
public String monitorMemoryPool() {
StringBuilder sb = new StringBuilder("MemoryPool:");
List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean p : pools) {
sb.append("[" + p.getName() + ":");
MemoryUsage u = p.getUsage();
sb.append(" Used=" + formatBytes(u.getUsed()));
sb.append(" Committed=" + formatBytes(u.getCommitted()));
sb.append("]");
}
return sb.toString();
}
コードまたはメソッドの前後に上記のコードを実行します。
Web サービスが他のリクエストを処理している間は、これは十分に正確ではない可能性があります。
@Gavin Xiongが言ったように、VisualVMのようなUIでいくつかのツールを使用できます。
ただし、本番環境では UI ツールを使用しない方がよいでしょう。
Single Thread
テストがより正確になります。