3

このサイトで Java アプリのメモリ制限に関する多くの投稿を検索して読みました。推奨されないことはわかっていますが、アプリケーションで使用される最大 RAM を本当に制限する必要がある場合は. どうすればいいですか?

私の現在のアプリケーションは、Oracle tutorialサイトから取得されます。Knock Knock Serverサーバーを実行し続け、クライアントからサーバーにメッセージを送信し続け、 を使用してメモリ使用量を監視しましたTask Manager。メッセージを送信するたびにメモリが増え続けていることに気付きました。System.gc();andについても学びRuntime.gc();、メモリ消費を削減できることを期待していましたが、残念ながらそうではありませんでした。予想通り。

ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));

これらのコマンドのいずれかでコマンドを使用できますgc()か? -Xmx-Xmsも同様に機能することを期待して試しました。

最後に、単純な Java サーバーを作成するのが得策でない場合。私は何をすべきか?

編集:私は と を使用-Xms9mして-Xmx10mいます。そして、アプリを10MBで実行し続けたいのですが、最初に起動したとき. 14MB から 17MB まで、そこから 20MB を超えて増加し続けることができます。

4

3 に答える 3

1

jvm のメモリを制限したい場合 (ヒープ サイズではありません) ulimit -v

jvm メモリとヒープ メモリの違いを理解するには、この優れた記事「Java プロセスのサイジングを詳しく見る」をご覧ください。

NativeHeap は -XX:MaxDirectMemorySize=256M (デフォルトは 128) で増減できます。

別の興味深い読み物: Java Performance Tuning

于 2013-11-07T10:17:57.867 に答える
0

まず、タスク マネージャーで VM メモリの使用状況を監視しないでください。GC ログを使用して、VM の正確なメモリ使用量を取得します。GC ログにメモリ消費量の増加が見られる場合は、問題があります。

次に、ソケット/接続を適切に再利用していることを確認してください。接続を閉じないことが、そのメモリの増加の原因である可能性があります-存在する場合。

于 2013-11-07T21:41:43.427 に答える