- - PR -
tomcatでのアプリが重く、原因が特定できません…
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 23:46
自己解決しました。
恥ずかしながら自分の書いたソースが原因でした。 初歩的な質問で申し訳ありませんでした。 YourKitというプロファイラを見つけ、プロファイルして原因がわかったのですが、 YourKit軽くて良いです。 [ メッセージ編集済み 編集者: 未記入 編集日時 2008-06-30 23:47 ] |
1