2009-03-26 9 views
14

もちろん、すべてのプロセスに独自のメモリスペースがあるので、そうではありません。Javaでは、静的なクラスメンバーはプログラム間で共有されていますか?

しかし、JVM全体の実際の動作はどうですか?私が立ち上げたすべてのJavaプログラムのために別々のプロセスに別々のJVMがありますか?システムで実行されているJavaプログラムは何も共有しませんか? OSとJVM実装の違いはありますか? プログラムが変数を共有するようにすることはできますか?(つまり、通常のIPCメカニズムではなくJVMを直接経由します)特別な目的のために、よりエキゾチックな1プロセスのJVMがありますか?

一般的に、JVMの厄介な点についてお勧めの読書はありますか? spec?いくつかの実装のソースコードですか?ウェブサイト?本?

答えて

23

Javaでは、プログラム間で静的なクラスメンバ が共有されていますか?

クラスはフルネームとそれをロードしたクラスローダーによって定義されます。同じクラスが同じJVMプロセス内にあり、2つのプログラムが同じクラスローダーを介してクラスをロードした場合、静的メンバーは共有されます。クラスローディングのルールは非常に重要です。

私は、すべてのプロセスはもちろん、独自の のメモリ空間を持っているので、いや、彼らは、 ないことを想像してみてください。

2つのアプリケーションを起動するために2つの別々のJVMを使用している場合は、正しいです。しかし、tomcatのようなアプリケーション/サーブレット・コンテナの場合は、同じプロセス(tomcatホスト・プロセス)で複数のアプリケーションをロードします。

しかし、全体のJVMの事物 は実際にどのように機能しますか?私が起動するすべてのJava プログラムのために別々のプロセスに個別のJVM がありますか? Java プログラムはシステム共有で実行していますか

コマンドラインで>java -cp...と入力するたびに、新しいプロセスが作成されます。 eclipseを実行するか、fork=trueでant javaタスクを呼び出すときには、新しいプロセスも作成されていることに注意してください。

OSと JVM実装の違いはありますか? プログラムが変数を共有するようにすることはできますか(つまり、 の通常のIPCメカニズムではなく、JVMを介して直接 に直接) 特別な目的のためにもっとエキゾチックな1プロセスのJVMがありますか?

ポスターが言ったように、Terracotaのようなプロジェクトがあります。このような共有の一般的なアプローチは分散キャッシュです。

+0

美しい答え。ありがとう:) – mac

6

いいえ、静的変数はJVM間ではありません。はい、実行するJavaアプリケーションごとに個別のJVMプロセスがあります。

いくつかの実装では、リソース(JITクラスのJITtedコード用のメモリなど)を共有できると思いますが、わかりません。より多くの共有を可能にするための継続的な作業があると確信していますが、まだ堅牢な方法ではあります。 (実際には、他のJVMがクラッシュして他の人に影響を与えることはありません)。

いいえ、プログラムは変数を透過的に共有することはできません。

私はJVMについての本があると思っていますが、私は何もお勧めできません。詳細については、HotSpotのホワイトペーパーをお探しの方がいいでしょう。 This oneはかなり良い出発点です。

1

あなたは正しいと思います。はい、各JVMは別のプロセスです。これは、2つのJavaプログラム(名前でプロセスをソートし、java.exeまたはjavaw.exeを検索する)を実行しているときにタスクマネージャを開いて確認できます。

JVMが(例えば、ローカルソケットと)お互いに接続することが可能であるが、中に組み込まれて何もない。

6

あなたの主な関心を約あればあなたはおそらくクラスローディングの面積でより多くを検索します静的クラスメンバのインスタンス化方法

別々のクラスローダーを使用する場合、同じVM上の異なるスレッドは独自の静的クラスnemberインスタンスを持つことがあります。

ここでの古典的な例は、異なるWebアプリケーションを別々に保つことですが、lib jarはすべてのアプリケーションに共通であるかもしれませんが、Apache Tomcatです。

+1

+1は、クラスローダーのために、静的変数のスコープを決定するものです。スレッド固有のものではありません。クラスローダーは、単一の実行スレッドでも変更できるためです。 JEEおよびOSGi環境では一般的です。 – Robin

2

実装にもよりますが、共有される方法があります。それを変更する作業が進行中であり、Sun(Apple経由)はVMのインスタンス間でデータを共有するために多くの作業を行っています。そのうちのいくつかについて説明するリンクがあります。here

どのような共有を行うには、VM実装者がそれを行う必要があります。プログラマは何かを行うことはできません。

VMの仕様はhereですが、それについての(古い)書籍もあります。あなたはまた、非常に小さいKaffeのソースを見ることができます。

2

JVM全体で変数を共有する場合は、Terracottaのようなクラスタリング製品を見ることができます。それらは自分自身を「ネットワーク接続メモリ」と呼び、複製技術を使用してJVM全体でオブジェクト参照を共有することができます。

1

Kevinが述べたことに続き、JVMインスタンス間で静的変数を共有できるJVMの実装はありません。以前の回答が(正確に)述べているように、各JVMインスタンスはそれ自身のプロセスです。

テラコッタ(JVMではなくクラスタリング技術)は、静的変数の共有を含め、JVMプロセス境界を越えてオブジェクトインスタンスを任意に共有することができます。したがって、モニカ "ネットワーク接続メモリ"。すべての目的と目的で、JVMプロセスでTerracottaテクノロジを使用すると、すべてのVMのすべてのスレッドが、単一の大きな共有ヒープをすべて見ているかのように動作します。 (物理的には可能ではないので、テラコッタはネットワークを使ってデータを移動させる高度な共有と複製のアルゴリズムで管理しているため、待ち時間とスループットがネイティブメモリアクセスと比較できない場合があります)

TerracottaのサイトのCookbookセクションには豊富な例があります - それはどのように動作するかを知るために、Hello Clustered Instance Recipeから始めることをお勧めします。

関連する問題