- - PR -
JVMPIについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-10-21 22:32
うろ覚えで書いてしまいますが、 次のコンパイルオプションの指定でどうでしょうか? -Wl,--enable-auto-import -Wl,--add-stdcall-alias | ||||
|
投稿日時: 2003-10-22 11:58
コンパイルの部分を以下のようにしてみたらうまくいきました。 (なぜ、そのオプションでうまくいくのでしょうかねぇ・・) g++ -Wl,--enable-auto-import -Wl,--add-stdcall-alias -shared $(INCLUDES) myprofiler.cpp -o $@ %java -Xrunmyprofiler クラス名 myprofiler> initializing ..... myprofiler> .... ok myprofiler> Class Load : --------------- myprofiler> Class Load : --------------- : : : : ありがとうございました。 さくらばさん、raccoonさんの助言ありがとうございました。 ここでもうひとつ質問があります。 Tomcatのcatalina.shの設定によりServletなどのWebアプリケーションの プロファイリングを行うことができるのでしょうか。(そのような記事を見つけたので) 今私の環境は以下です。 [環境] Windows2000 Professional j2sdk1.4.1 Tomcat4.1.24 Apache2.0.45 よろしくお願いします。 _________________ 学生 | ||||
|
投稿日時: 2003-10-22 14:00
こんにちは、さくらばです。
可能です。catalina.sh の JAVA_OPTS に -Xrunmyprofiler を追加すれば いいと思います。 # ただし、プロファイラが一緒に動くと重たいですよ | ||||
|
投稿日時: 2003-10-22 18:14
実際にcatalina.shに、 JAVA_OPTS=-Xrunmyprofiler として実行したところ、どこに出力されるのか分かりませんでした。 先輩から聞いたところ、Loggerという機構を使って 結果を取り出せると聞いたのですが、他にも出力結果を見る方法はあるのでしょうか。 _________________ 学生 | ||||
|
投稿日時: 2003-10-22 19:20
myprofilerの出力先はいまはstderrですよね。 JavaのコードならJ2SDK 1.4のLoggerやJakarta Log4jが使えますし、 System.errに出力したものはcalalina.outってファイルに出力されるはず。 でも、JVMPIのコードはC++のコードですから、これらは使えません。 (stdout.logやstderr.logには‥‥出てるかも知れませんが) ですので、私がやるならまずは次のようにします。 1) 単純にファイルに出力してみる。 2) Log4cpp (http://log4cpp.sourceforge.net/)、 LOG4CXX (http://log4cxx.sourceforge.net/)、 Log4c (http://log4c.sourceforge.net/)を使ってみる。 また、http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jvmpi/jvmpi.html#hprof-exampleのhprof.zipも参考になるかも。 [ メッセージ編集済み 編集者: ちいにぃ 編集日時 2003-10-22 19:52 ] | ||||
|
投稿日時: 2003-10-22 21:35
こんにちは、さくらばです。
hprof はだめです というのも、あれはアプリケーションが動作中の時はデータをずっと内部に 持っていて、終了時にファイルやソケットに書き出すようになっているからです。 Logger を使って常にプロファイル結果を出力するのもいいと思いますが、 私のお勧めはリモートで監視する方法です。プロファイラでサーバソケット を accept 状態にしておいて、リモートからそこにコネクトするようにします。 こうすると、必要なときだけプロファイルの情報を得ることができます。また、 accept したときからプロファイルを開始するようにすれば、普段の負荷を 抑えることができます。 さらに、リモートのクライアントは JVMPI と関係はないので、Java で作る ことができるという利点もあります。そうすれば、Log4J でも loggin API でも 自由に使うことができます。 市販のプロファイラの Optimizeit や JProbe なども通信を行って、アプリケー ションのプロセスとプロファイラ本体のプロセスを分けているようです。 | ||||
|
投稿日時: 2003-10-23 10:59
有用な情報ありがとうございます。 確かにいただいたサンプルコードには、サーバソケットを利用して 情報を取得しているようでした。 私には難しい感じもしますが、勉強してみようと思います ちいにぃさんのいうとおりとりあえず、ファイルとして出力してみようと思いました。 そこで、myprofiler.cppを ------------------------------------------------------- #include <jvmpi.h> // global jvmpi interface pointer static JVMPI_Interface *jvmpi_interface; FILE *fp; // function for handling event notification void notifyEvent(JVMPI_Event *event) { switch(event->event_type) { case JVMPI_EVENT_CLASS_LOAD: fprintf(fp, "myprofiler> Class Load : %s\n", event->u.class_load.class_name); break; } } // profiler agent entry point extern "C" { JNIEXPORT jint JNICALL JVM_OnLoad(JavaVM *jvm, char *options, void *reserved) { fp = fopen("myprofiler.log", "w"); fprintf(fp, "myprofiler> initializing ..... \n"); // get jvmpi interface pointer if ((jvm->GetEnv((void **)&jvmpi_interface, JVMPI_VERSION_1)) < 0) { fprintf(fp, "myprofiler> error in obtaining jvmpi interface pointer\n"); return JNI_ERR; } // initialize jvmpi interface jvmpi_interface->NotifyEvent = notifyEvent; // enabling class load event notification jvmpi_interface->EnableEvent(JVMPI_EVENT_CLASS_LOAD, NULL); fprintf(fp, "myprofiler> .... ok \n\n"); return JNI_OK; } } -------------------------------------------------------------- とファイルポインターを用いてmyprofiler.logに出力しようとしました。 実行クラスファイルは、Tomcatにデフォルトで付属していたHelloWorldExampleを 利用してWeb browserからアクセスしてみました。 しかしながら、そのファイルが生成されないようなのです。 myprofiler.dllファイルは、C:\j2sdk1.4\jre\bin\clientに置いたままで パスは通してあります。 また、catalina.shファイルにも、JAVA_OPTS=-Xrunmyprofiler と追加してあります。 今TomcatとApacheを連携させているので、もしかしたらApacheの設定が 必要かもしれないですね。 何か設定方法が誤っているのでしょうか。 よろしくお願いします。 _________________ 学生 [ メッセージ編集済み 編集者: がっさん 編集日時 2003-10-23 11:14 ] [ メッセージ編集済み 編集者: がっさん 編集日時 2003-10-23 11:15 ] [ メッセージ編集済み 編集者: がっさん 編集日時 2003-10-23 11:14 ] [ メッセージ編集済み 編集者: がっさん 編集日時 2003-10-23 11:49 ] | ||||
|
投稿日時: 2003-10-23 14:38
1) とりあえず、myprofiler.logを絶対パスで固定してみましょう。
たとえばこんなふうに。 fp = fopen("c:\\myprofiler.log", "w"); 2) Tomcat 4を「サービスとして起動」しているなら、 JavaVMへのオプションはサービスのレジストリにあります。 KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 以下を 探してみてください。 |