- PR -

tomcatでのアプリが重く、原因が特定できません…

1
投稿者投稿内容
未記入
会議室デビュー日: 2008/06/30
投稿数: 12
投稿日時: 2008-06-30 10:12
WEBアプリを作成しており、tomcatの起動が遅くて困っています。
tomcat起動後のアプリの動作も遅いです。
(たまに通常通り(遅くない)起動し、動作します。)

原因がわからず困っております。

お伺いしたいことは、
[1]下記の状況でも自分の作成したソースに原因があることも考えられるか。
[2]下記の状況で原因のあたりが付けばご教授お願いします。

【実行環境】
winXPpro
apache2.2.8
tomcat5.5
eclipse3.2
jdk1.5.0_11
sen1.2.2.1

tomcatの重い起動のあと、アプリを動作させ
ブレークポイントで
return mapping.findForward(uri);
で止めてみるのですが、ここまでは通常通り(遅くない)動作します。

プロファイルしようとTPTP導入しました。
プロファイラからtomcatの起動を掛けたのですが、
CPU(デュアルコア)の片方がほぼ100%、もう片方は30%前後で重くて
プロファイラを使用できない状態です。

プロファイラを使用せず、eclipseからtomcat実行した場合に
コンソールに表示されているログから、長く時間の掛かっている所は以下2か所。
-----------------
2008-06-30 09:40:55,031 INFO net.java.sen.util.DoubleArrayTrie.load(DoubleArrayTrie.java:49) - loading double array trie dict = C:\xxx\jars\sen-1.2.2.1\dic/da.sen
2008-06-30 09:43:06,031 INFO net.java.sen.util.DoubleArrayTrie.load(DoubleArrayTrie.java:58) - loaded time = 130.922[ms]
-----------------
2008-06-30 09:43:06,312 INFO net.java.sen.Tokenizer.loadConnectCost(Tokenizer.java:73) - connection file = C:\xxx\jars\sen-1.2.2.1\dic\matrix.sen
2008-06-30 09:47:11,046 INFO net.java.sen.Tokenizer.loadConnectCost(Tokenizer.java:95) - time to load connect cost file = 244562[ms]
-----------------

どちらもsen絡みなのですが、ソースを見てみるとファイル読み込みのループが存在しており、
I/Oに時間がかかっているようにも見えてしまいます。

【DoubleArrayTrie.java】
public void load(String fileName) throws IOException {
log.info("loading double array trie dict = " + fileName);
long start = System.currentTimeMillis();
File file= new File(fileName);
array = new int[(int)(file.length() / 4)];
DataInputStream is = new DataInputStream
(new BufferedInputStream(new FileInputStream(file), BUF_SIZE));
for (int i = 0 ; i < array.length ; i++) {
array[i] = is.readInt();
}
log.info("loaded time = " + (((double)(System.currentTimeMillis()- start))/1000) + "[ms]");
}

【Tokenizer.java】
private void loadConnectCost(String connectFile) throws IOException {
FileAccessor fd = null;
long start;

File f = new File(connectFile);

log.info("connection file = " + f.toString());
start = System.currentTimeMillis();
fd = FileAccessorFactory.getInstance(f);
msize1 = fd.readShort();
msize2 = fd.readShort();
msize3 = fd.readShort();

// first 3 value means matrix information:
// *2 means information is short.
// each matrix value is short, so / 2

int len = ((int) f.length() - (3 * 2)) / 2;

log.debug("msize1=" + msize1);
log.debug("msize2=" + msize2);
log.debug("msize3=" + msize3);
log.debug("matrix size = " + len);

matrix = new short[len];
for (int i = 0; i < len; i++) {
matrix[i] = fd.readShort();
}
log.info("time to load connect cost file = "
+ (System.currentTimeMillis() - start) + "[ms]");
fd.close();
}

他に必要な情報があれば出しますので、ご指摘ください。
何卒よろしくお願いいたします。

未記入
会議室デビュー日: 2008/06/30
投稿数: 12
投稿日時: 2008-06-30 23:46
自己解決しました。
恥ずかしながら自分の書いたソースが原因でした。
初歩的な質問で申し訳ありませんでした。

YourKitというプロファイラを見つけ、プロファイルして原因がわかったのですが、
YourKit軽くて良いです。


[ メッセージ編集済み 編集者: 未記入 編集日時 2008-06-30 23:47 ]
1

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