- PR -

JVMPIについて

投稿者投稿内容
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2003-10-21 22:32
引用:

% java -Xrunmyprofiler クラス名
としても
Error occurred during initialization of VM
Could not find JVM_OnLoad function in -Xrun library: myprofiler
とエラーメッセージが返ってきます。


うろ覚えで書いてしまいますが、
次のコンパイルオプションの指定でどうでしょうか?
-Wl,--enable-auto-import
-Wl,--add-stdcall-alias
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-22 11:58
引用:

ちいにぃさんの書き込み (2003-10-21 22:32) より:
うろ覚えで書いてしまいますが、
次のコンパイルオプションの指定でどうでしょうか?
-Wl,--enable-auto-import
-Wl,--add-stdcall-alias



コンパイルの部分を以下のようにしてみたらうまくいきました。
(なぜ、そのオプションでうまくいくのでしょうかねぇ・・)
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

よろしくお願いします。



_________________
学生
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-10-22 14:00
こんにちは、さくらばです。

引用:

がっさんさんの書き込み (2003-10-22 11:58) より:

ここでもうひとつ質問があります。
Tomcatのcatalina.shの設定によりServletなどのWebアプリケーションの
プロファイリングを行うことができるのでしょうか。(そのような記事を見つけたので)



可能です。catalina.sh の JAVA_OPTS に -Xrunmyprofiler を追加すれば
いいと思います。

# ただし、プロファイラが一緒に動くと重たいですよ
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-22 18:14
引用:

さくらばさんの書き込み (2003-10-22 14:00) より:
可能です。catalina.sh の JAVA_OPTS に -Xrunmyprofiler を追加すれば
いいと思います。



実際にcatalina.shに、

JAVA_OPTS=-Xrunmyprofiler

として実行したところ、どこに出力されるのか分かりませんでした。
先輩から聞いたところ、Loggerという機構を使って
結果を取り出せると聞いたのですが、他にも出力結果を見る方法はあるのでしょうか。


_________________
学生
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2003-10-22 19:20
引用:

実際にcatalina.shに、
JAVA_OPTS=-Xrunmyprofiler
として実行したところ、どこに出力されるのか分かりませんでした。
先輩から聞いたところ、Loggerという機構を使って
結果を取り出せると聞いたのですが、他にも出力結果を見る方法はあるのでしょうか。



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 ]
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-10-22 21:35
こんにちは、さくらばです。

引用:

ちいにぃさんの書き込み (2003-10-22 19:20) より:

ですので、私がやるならまずは次のようにします。
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も参考になるかも。




hprof はだめです
というのも、あれはアプリケーションが動作中の時はデータをずっと内部に
持っていて、終了時にファイルやソケットに書き出すようになっているからです。

Logger を使って常にプロファイル結果を出力するのもいいと思いますが、
私のお勧めはリモートで監視する方法です。プロファイラでサーバソケット
を accept 状態にしておいて、リモートからそこにコネクトするようにします。

こうすると、必要なときだけプロファイルの情報を得ることができます。また、
accept したときからプロファイルを開始するようにすれば、普段の負荷を
抑えることができます。

さらに、リモートのクライアントは JVMPI と関係はないので、Java で作る
ことができるという利点もあります。そうすれば、Log4J でも loggin API でも
自由に使うことができます。

市販のプロファイラの Optimizeit や JProbe なども通信を行って、アプリケー
ションのプロセスとプロファイラ本体のプロセスを分けているようです。
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-23 10:59
引用:

さくらばさんの書き込み (2003-10-22 21:35) より:

Logger を使って常にプロファイル結果を出力するのもいいと思いますが、
私のお勧めはリモートで監視する方法です。プロファイラでサーバソケット
を accept 状態にしておいて、リモートからそこにコネクトするようにします。

こうすると、必要なときだけプロファイルの情報を得ることができます。また、
accept したときからプロファイルを開始するようにすれば、普段の負荷を
抑えることができます。

さらに、リモートのクライアントは JVMPI と関係はないので、Java で作る
ことができるという利点もあります。そうすれば、Log4J でも loggin API でも
自由に使うことができます。

市販のプロファイラの Optimizeit や JProbe なども通信を行って、アプリケー
ションのプロセスとプロファイラ本体のプロセスを分けているようです。




有用な情報ありがとうございます。
確かにいただいたサンプルコードには、サーバソケットを利用して
情報を取得しているようでした。
私には難しい感じもしますが、勉強してみようと思います

ちいにぃさんのいうとおりとりあえず、ファイルとして出力してみようと思いました。
そこで、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 ]
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2003-10-23 14:38
1) とりあえず、myprofiler.logを絶対パスで固定してみましょう。
たとえばこんなふうに。
fp = fopen("c:\\myprofiler.log", "w");

2) Tomcat 4を「サービスとして起動」しているなら、
JavaVMへのオプションはサービスのレジストリにあります。
KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 以下を
探してみてください。

スキルアップ/キャリアアップ(JOB@IT)