これらは, デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
((cite: hotspot/src/share/vm/utilities/histogram.hpp))
#ifdef ASSERT
これらは, 様々な統計情報を集めるためのクラス.
といっても現状の実装では「何らかのイベントが発生した回数を記録する」という処理に特化している (典型的な使われ方は, 指定の関数が呼び出された回数を記録する, というもの).
簡単な使い方は以下の通り (なおこの例も, 特定の関数が何度呼び出されたかを記録する, というもの. 記録した結果は Histogram::print_on() で出力できる.)
Histogram* 型の変数を宣言する.
HistogramElement クラスのサブクラスを作る.
("1." で作った Histogram* 型の変数は, このサブクラスの中で遅延初期化すればいい)
class MyHistogramElement : public HistogramElement {
public:
MyHistogramElement(char* name);
};
MyHistogramElement::MyHistogramElement(char* elementName) {
_name = elementName;
if(MyHistogram == NULL)
MyHistogram = new Histogram("My Call Counts",100);
MyHistogram->add_element(this);
}
"2." で作った HistogramElement のサブクラスを使うためのマクロを定義しておく.
#define MyCountWrapper(arg) static MyHistogramElement* e = new MyHistogramElement(arg); e->increment_count()
呼び出し回数を記録したい関数の先頭箇所に, "3."で作ったマクロを記述する.
void a_function_that_is_being_counted() {
MyCountWrapper("FunctionName");
...
}
((cite: hotspot/src/share/vm/utilities/histogram.hpp))
// This class provides a framework for collecting various statistics.
// The current implementation is oriented towards counting invocations
// of various types, but that can be easily changed.
//
// To use it, you need to declare a Histogram*, and a subtype of
// HistogramElement:
//
// HistogramElement* MyHistogram;
//
// class MyHistogramElement : public HistogramElement {
// public:
// MyHistogramElement(char* name);
// };
//
// MyHistogramElement::MyHistogramElement(char* elementName) {
// _name = elementName;
//
// if(MyHistogram == NULL)
// MyHistogram = new Histogram("My Call Counts",100);
//
// MyHistogram->add_element(this);
// }
//
// #define MyCountWrapper(arg) static MyHistogramElement* e = new MyHistogramElement(arg); e->increment_count()
//
// This gives you a simple way to count invocations of specfic functions:
//
// void a_function_that_is_being_counted() {
// MyCountWrapper("FunctionName");
// ...
// }
//
// To print the results, invoke print() on your Histogram*.
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
Histogram クラス内で使用される補助クラス (Histogram 内に格納される要素を表すクラスの基底クラス).
1つの HistogramElement オブジェクトが 1つの統計情報に対応する.
((cite: hotspot/src/share/vm/utilities/histogram.hpp))
class HistogramElement : public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
様々な統計データの収集/出力を行うためのユーティリティ・クラス.
((cite: hotspot/src/share/vm/utilities/histogram.hpp))
class Histogram : public CHeapObj {
現状では, 以下の大域変数に(のみ)格納されている.
集めた結果は, print_statistics() 内で出力されている.
ただし, (デバッグ時であることに加えて) それぞれ CountRuntimeCalls オプション, CountJNICalls オプション, CountJVMCalls オプションが指定されている場合にしか出力処理は行われない.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.