0

私たちが知っていることは、変数を別の にJVM格納することだけです。作成するたびに定数として格納され、新しい変数を同じ値として作成すると、新しい定数の作成を除いて同じ参照が使用されます。StringStringPoolString (eg. String s1 = "anystring")StringString

でその変数の寿命が何であるかを知りたいだけですStringPool。それapplication levelJAVA environment level

質問:JVMレベルの場合、異なるアプリケーションは同じ参照を使用しますか?

String理論的にはどこにいるのかわかりません。しかし、私は答えを探しています。

4

2 に答える 2

2

文字列プール内のオブジェクトの有効期間は、他のオブジェクトと同じ規則によって管理されます。オブジェクトは到達可能である限り存在し続けます。到達不能になった後、しばらくすると回収されます。

クラスのリテラルに対応する String オブジェクトが「異なる」唯一の点は、クラスのコードを介してオブジェクトに到達できることです。通常、クラスのコードの存続期間は JVM の存続期間です。ただし、クラスが動的にロードされた場合、それをロードしたクラスローダーを到達不能にするなどすると、クラスが到達不能になり、リテラル オブジェクトが到達不能になる可能性があります。

StringPool のその変数の寿命を知りたいだけです。アプリケーションレベルかJAVA環境レベルか。

「アプリケーション レベル」と「Java 環境レベル」が何を意味するのかは明確ではありませんが、通常の状況では、実行中のアプリケーションの寿命は JVM の寿命と同じです。いずれにせよ、到達可能性分析によってすべてが決定されます。つまり、GC がオブジェクトを計算で使用できるかどうかを判断するために使用する「トレース」プロセスです。


実際、あなたの質問のこのステートメントは間違いなく間違っています。

JVM が String 変数を別の StringPool に格納することはわかっています。

実際、Java 7 では、文字列プールは実際には permgen ヒープではなく、通常のヒープに格納されます。(さらに、あなたは本当に文字列変数ではなく文字列オブジェクトを意味します。オブジェクトと変数はまったく同じものではありません...)

于 2013-05-08T11:43:44.027 に答える
0

文字列オブジェクトは Java のアプリケーション レベルで格納され、すべての文字列オブジェクトはそのクラス スコープに制限されます。

于 2013-05-08T11:26:21.153 に答える