以下はMSDNからの抜粋です。
共通言語ランタイムは、インターン プールと呼ばれるテーブルを維持することで、文字列ストレージを節約します。このテーブルには、プログラムでプログラムによって宣言または作成された一意の各リテラル文字列への単一の参照が含まれています。したがって、特定の値を持つリテラル文字列のインスタンスは、システム内に 1 回だけ存在します。
たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターン プールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。
Intern メソッドは、インターン プールを使用して、str の値に等しい文字列を検索します。そのような文字列が存在する場合は、インターン プール内のその参照が返されます。文字列が存在しない場合は、str への参照がインターン プールに追加され、その参照が返されます。.... アプリケーションが割り当てるメモリの総量を削減しようとしている場合は、文字列のインターンには 2 つの望ましくない副作用があることに注意してください。まず、インターンされた String オブジェクトに割り当てられたメモリは、共通言語ランタイム (CLR) が終了するまで解放されない可能性があります。
これは、CLR が実行中のすべての .net アプリに対して 1 つのインターン プールを保持するということですか? 例: プログラム A が文字列リテラル "Test" を作成し、別のプログラムが別の文字列リテラル "Test" を作成しようとした場合、同じコピーが使用されますか? 同じ質問が JVM にも当てはまります。