1

データベースを管理するアプリケーションに取り組んでいます。サーバー/クライアントとして設計されており、サーバーがすべてのデータベースのトランザクションを処理します。

それはちょっと次のように機能します:

  • サーバーが起動すると、ソケットが開き、ポートでのリッスンが開始されます。
  • クライアントが起動すると、ソケット/ポートを検索し、開いている場合はサーバーが新しいスレッドを起動します。

    while (true) {
        new Thread(new comm.Protocol(serverSocket.accept()).start();
    }
    

スレッドに入ると、サーバーは通信に必要なオブジェクト ( ObjectInputStream& ObjectOutputStream) を作成し、クライアントがログイン情報を送信するのを待ちます。受信すると、サーバーは新しい接続を作成しようとします。

    Class.forName("com.mysql.jdbc.Driver");
    connection=DriverManager.getConnection(dbName, username, password);

成功した場合、接続を保存し、クライアントの要求を待機してループを続けます。通信は、クエリに必要なクライアントの要求の種類とデータ オブジェクトを含む DTO を使用して行われます。サーバーは DTO を受け取り、要求の種類を切り替えて、要求されたクエリを実行します。Plain Old Java Object次に、クエリ対象のテーブルをモデル化するの形式で結果を設定するかjava.util.ArrayList<POJO-Typed-Object>、DTO で複数結果のクエリを実行し、それをクライアントに送り返します。

それは明らかに正常に動作しますが、いくつかのクエリの後、特に大量の行を持つクエリの後、サーバーアプリケーションがメモリ不足になります。

PreparedStatementsは使用後に閉じられ、ResultSets も閉じられるため、メモリがどこにあるのかわかりません。

どんな提案でも大歓迎です。

4

3 に答える 3

2

アプリケーションでメモリ リークが発生している可能性があります。実際にメモリを保持しているものをテストするには、これらのオプションを使用して Java プログラムを起動できます。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="C:\"

プログラムがクラッシュすると、C:\ ドライブにヒープ ダンプが作成されます。ヒープ ダンプを分析するためのツールがいくつかあります (使用している IDE によって異なります)。日食の場合は、http: //www.eclipse.org/mat/ をダウンロードできます。

heapDump を解析すると、メモリを保持しているオブジェクトを確認できます。

ええ、ちょっとしたメモ: 各クライアントのスレッドのソリューションはスケーリングしません。アーキテクチャを再設計します。

于 2013-05-06T19:37:53.473 に答える
0

を取得した唯一の理由は、 with をOutOfMemoryError閉じなかったいくつかのクエリがあったときでしたCursorcursor.close();

于 2013-05-06T19:55:11.883 に答える