3

共有環境でEclipseをセットアップしようとしています。つまり、Eclipseはサーバーにインストールされ、各ユーザーはVNCを使用してEclipseに接続します。Eclipseを共有する理由はいくつかあります。1つはClearCaseとの適切な統合です。

Eclipseが大量のメモリを使用していることを確認しました。Eclipse(JVM?)がユーザー/セッションごとに各クラスを1回ロードするのか、それともすでにメモリにロードされているオブジェクトの共有があるのか​​疑問に思っています。

これは私に一般的な基本的な質問について考えさせます。2人以上のユーザーが同時にホストにアクセスしているときに、プログラムのコピーがメモリにロードされる数。

ユーザーごとに1つですか、それとも1つのコピーがユーザー間で共有されますか?

ここに2つの質問:

1)2人以上のユーザーが同時に使用している場合、プログラムのコピーはいくつメモリにロードされますか?

2)上記はJava / JVMの世界でどのように当てはまりますか?

4

2 に答える 2

2

Linuxでは、実行中のプロセス間でバイナリコードを共有できます。つまり、プログラムの実行可能部分を保持するセグメントは、実行中virtual memoryの各コピーのスペースにマップされます。次に、各プロセスは独自のデータ部分(スタック、ヒープなど)を取得します。

Javaまたは他のほとんどすべてのインタプリタ言語の問題は、ランタイムであるJVMがバイトコードをデータとして扱い、それをヒープにロードすることです。Javaが半分コンパイルされ、半分解釈されるという事実は、ここでは関係ありません。これにより、JVM実行可能ファイル自体はOSによるコード共有の対象になりますが、アプリケーションのJavaコードは対象外になります。

于 2012-06-12T12:39:39.527 に答える
1

一般に、プログラムの単一のコピー(つまりテキストセグメント)がRAMにロードされ、すべてのインスタンスで共有されるため、まったく同じ読み取り専用メモリが物理ページをマップします(ただし、おそらく/おそらく異なるアドレス空間の異なるアドレスにマップされますが、それはまだ同じメモリです)。データは通常、各プロセスにプライベートです。つまり、各プログラムのデータは別々のページのRAMにあります(ただし、共有することはできます)。

しかし

問題は、ここでの実際のプログラムはJavaランタイムインタープリターまたはJITコンパイラーだけであるということです。Eclipseは、すべてのJavaプログラムと同様に、プログラムではなくデータです(ただし、プログラムとして解釈されます)。そのデータはプライベートアドレス空間にロードされ、JVMによって解釈されるか、JITコンパイラによって実行可能ファイルに変換され、(一時的な)実行可能バイナリが起動されます。これは、原則として、各Javaプログラムが個別のRAMを使用して個別のコピーとして実行されることを意味します。

もちろん、運が良ければ、JVMはデータを共有マッピングとしてロードする可能性があります。この場合、バイトコードはすべてのインスタンスで同じ同じRAMを占有します。ただし、それが事実であるかどうかは、JVMの作成者だけが判断できることであり、一般的に信頼できるものではありません。

また、JITの巧妙さによっては、そのバイナリをしばらくの間キャッシュして、同一のJavaプログラムで再利用する場合があります。これは、コンパイルを節約するだけでなく、非常に有利です。同じ実行可能イメージから起動されたすべてのインスタンスは同じメモリを共有するため、これはまさにあなたが望むものになります。
コンパイルはかなり高価であり、一般的な最適化であるため、これはJITコンパイラで(少なくともある程度は)行われる可能性があります。

于 2012-06-12T12:44:24.760 に答える