2011-07-27 23 views
4

apache wicketフレームワークを使用してJava Webアプリケーションを開発し、ORマッピング用にPostgreSQLを使用するEclipselinkを開発しています。Java Webアプリケーションの実行速度が遅くなる

私がアプリケーションを(ローカルホスト上またはリモートサーバー上で)実行すると、すべてが高速で使いやすいものになります。現時点では5人のユーザーしかいません。約1日後、アプリケーションの一部が遅くなり始めます。特に、データベースからのデータを使用するページ、およびOWLファイルからのデータを使用するオートコンプリート機能。静的なページはかなり高速に読み込まれます。

どのように問題を見つけることができますか?

EDIT:あなたの返信用

感謝。問題は、セッションによって生成されたメモリ使用量のようです。なぜ私はローカルマシン上で1人のユーザしか問題を再現できないのかを説明します。 Tomcatを起動するときにヒープサイズ(-Xmxと-Xms)を増やしていました。今度は、私はウィケットのページを詳しく見て、メモリを消費するモデルを見つけます。

+5

メモリ使用量はどのくらいですか? – Nanne

+0

...なぜ毎晩webappを再起動しないのですか?私は知っている、それは問題を解決しませんが、それを緩和します。 –

+0

リークのようです... – Stas

答えて

7

Wicketのは、直列化されたページの「重み」を中心に、かなり固体コーディングプラクティスを求めています。シリアライズされたページはセッションに格納されます。クラスレベルのモデルをデタッチできない場合は、データもシリアル化されます。これを理解する前に、私はデータベースのクエリの半分をシリアライズしていたので、セッションサイズが数百MBに達するのがわかりました!

ので、役立つかもしれないいくつかのこと:

は、セッションが大きすぎる場合は、変更時に警告を表示するために、あなたのセッションストアを上書き

public class CustomSessionStore extends SecondLevelCacheSessionStore { 

    @Override 
    public void setAttribute(Request request, String name, Object value) { 
     super.setAttribute(request, name, value); 

     if (Session.get().getSizeInBytes() > SESSION_WARN_LIMIT) { 
      log.warn("Session Size is {} bytes", Session.get().getSizeInBytes()); 
     } 
    } 
} 

、あなたのモデルを外していることを確認してください:アプリケーションの実行中に

public class MyPage extends WebPage { 

    IModel<HeavyDataObject> heavyModel; 

    @Override 
    public void onDetach() { 
     if (heavyModel != null) 
      heavyModel.detach(); 
    } 

} 

は、各種のデータサイズ/ストアを監視するために改札開発ツールを使用してください。 Mavenの依存性が役立ちますorg.apache.wicket wicket-devutils

希望です!

+0

heavyModelをLoadableDetachableModelとして宣言する必要がありますか? –

+1

すべてのモデルは「取り外し可能」です。 LoadableDetachableModelは、正しく使用されると重たいものを 'detach()'に落とし、次回の要求時に重いものを提供する(一般的に使用される)便利なモデルです。 – jbrookover

+0

CustomSessionStoreはどこに統合すればよいですか? –

0

よく、dynaTraceのようなツールを使用すると、パフォーマンスの問題が発生しているアプリケーションのレイヤーがすぐに表示されるため、作業が楽になります。

しかし、そうしていない代わりに、私はあなたのシステム上のあなたのメモリとCPU使用率を調べて、それがスパイクするかどうかを調べます。時間の経過とともにメモリ使用量を調べます。ガベージコレクタが何をしているのか、実行後にどれだけ解放されているのかを確認してください。おそらく、あなたはメモリリークを起こしています。オブジェクトは、それらを生かし続けるいくつかのあいまいな "リンク"を介してヒープ上に残しています。 StringBufferを使用する代わりに、たくさんのStringを作成し、たくさんの "+"連結を行っていますか?

また、StringBufferを使用するのではなく、たくさんのStringを作成していますか?アプリケーションの特定の部分だけが遅いのでしょうか、それとも全体的なものでしょうか?おそらくヒープ上でより多くのメモリを必要とするでしょうか?おそらくDBをチェックしてインデックスやより効率的なクエリなどを推奨する必要があります。

もう1つの考え方...悪い意味でこれを意味するわけではありません....あなたのシステムや別のシステムにアプリケーションをロードしてから「生産」に入れるか、どこに問題があるのか​​をテストしましたか?

探してみたいことのちょっとしたアイデア。一度に1つのことを調整して、違いが生じたかどうかを確認してください。一度にあまりにも多くのものをチューニングしても、本当に問題が修正されたかを知るのには役立ちません。

しかし、正直なところ...私はdynaTraceなどのツール(私たちは当社で使用しているのでdynaTraceを知っています)を調べます。それ以外の場合は、トラブルシューティングを行うときに追求する方が良い方向になります。

ああ、HttpSessionを使用してたくさんの変数を保存する場合は注意が必要です。そうした場合、すぐにメモリが使い果たされる可能性があります。

1

jVisualVMはあなたの友人です。

eclipseを使用してアプリケーションを開発する場合は、Memory Analysis Toolプラグインと素敵なチュートリアルhereを検討してみてください。

  • チェックメモリは、その後、時間の派遣要請を検討し
  • 最初にアプリケーションの使用しています...

これらは、ボトルネックを見つけるための簡単スタートすることができます。

1

私は、アプリケーションをプロファイリングするための便利なツールである、過去にYourkitを使用しました。

0

これは間違いなく私の記憶に似ています。あなたのマシン、特にJVMがスワップしているように聞こえます。 JVMのスワッピングよりも悪いことはありません。空きメモリの

25メガバイトは、特に1ギガバイトのうち「何も」今日、ではありません。

私は5人のユーザーと、彼らがあなたの問題の原因であることはほとんどありませんので、これは単純であると言う理由。あなたはたくさんのウェブトラフィックをしているかもしれませんし、物事を保存することは本当にひどいデータ構造であり、5人のユーザーのトラフィックから蓄積されたデータに対していくつかのO(n^2)アルゴリズムを実行します。

これはすべて可能です。それは本当に起こりそうもありません。

あなたのマシンのリソースが逼迫していることや、Javaなどの今日の欲望に溢れた記憶があるため、私たちが知っている限りでは、 。

関連する問題