19

私はいつも疑問に思っていましたが、なぜJavaではヒープサイズを手動で設定する必要があるのですか?他の言語で書かれたプログラムは、OSがそれ以上割り当てることができなくなるまで、プログラムの実行と同じだけのメモリを割り当てるという印象を受けました。

Javaの世界では、ヒープ、スタック、およびpermgenのサイズを設定する必要があります。これは単純ですが、これらを「十分な大きさ」の数に増やすのを忘れるのは、サーバーがダウンするのを私が見た最大の理由です。

ヒープ/スタック/permgenを時間の経過とともに必要なだけ拡張するようにJavaに指示できないのはなぜですか?

4

4 に答える 4

8

3つの理由:

  1. Javaは、Webアプリを作成するための言語であることが意図されていたためです。一般に、Webアプリにすべてのマシンリソースを引き継がせるのは良い考えではないと考えられています。
  2. Javaはガベージコレクションされているためです。メモリの上限を指定するだけでなく、ヒープサイズもガベージコレクションをトリガーします。基本的に、あなたは「これだけ使うことができますが、その限界に達したときは片付けなければなりません」と言っています。
  3. Javaプロセスで使用されるメモリの量を制限したいアプリケーションのクラスはたくさんあります。たとえば、両方に十分なメモリがない場合に他のプロセスを続行することがより重要です。
  4. ヒープサイズを制限できるのは機能だからです。プロセスが無制限のメモリを持つことができるアプローチが好きな場合は(前述の他の言語のように)、ヒープ制限を取得できるよりも多くなるようにいつでも設定できます。ヒープサイズを制限したい場合は、それを行うことができます。他の言語には、それらの可能な動作の1つしかないため、柔軟性が低くなります。
于 2010-08-18T21:42:02.407 に答える
6

私の解釈では、Sunはビッグボックスの販売に焦点を当てた会社であり、システム管理者がこれらのボックスで何かを実行できることを望んでいます。システムを実行してすべてのメモリをいっぱいにすることは、システムを地面に実行するための良い方法であり、たとえばログインシェルを作成するためにメモリを割り当てることができないため、操作を復元するためのアクションを効率的に実行できません。

于 2010-08-18T21:08:49.893 に答える
4

コンピュータの実際のメモリは有限だからだと思います。したがって、ある意味で、JVMを使用すると、すべてのメモリが浪費される前にmemleaksを検出できます。
さらに、同じマシンで複数のJVMを実行している場合はどうすればよいですか?この場合、これらの各JVMを「必要なだけ」成長させるにはどうすればよいでしょうか。

于 2010-08-18T21:08:16.380 に答える
1

ヒープ、スタック、およびpermgenのサイズを動的に増やすと、とにかくサーバーがダウンするだけです。このような世界では、サーバーは最終的にすべてのリソースをリークします。

また、自動メモリ管理の開発は、今日ほど成熟していませんでした。仮想制限があると、間違ったデフォルトを選択した場合に作業が簡単になりますが、バックエンドでのコーディングの効率が少し低下する可能性があります。

はい、これらは推測ですが、合理的なものです。特に、Java/Oakの組み込みセットトップボックスプログラミングの起源を考えると。組み込みシステムがスワップまたはディスクでバックアップされた仮想メモリを備えているわけではないのに、なぜJVMを利用可能であるかのように動作させるのでしょうか。

于 2010-08-18T21:14:15.547 に答える