CheatEngine 使ってメモリ検索してみました

ローカルにString リテラルを宣言してスリープするだけのプログラムで、若いアドレスに3つ、比較的後ろの方のアドレスに2つ その文字列がヒットします
なぜメモリに5つ文字列出来上がるのか分かりません

若いアドレスの3つは多分ヒープで、gc すると1つだけ残って2つ消える
String を new するだけなんですが、途中過程でヒープに2個ゴミが出来るんでしょうか

後ろの方のアドレスの2つは、コード中に文字列リテラルを書かなければ出来ない(char 配列から new String した場合は出来ない)
こっちも gc すると 1つ になります
Run-time Constant Pool には参照しか保持されてないとすると、これは何でしょう?

まとめますと、
String リテラルを宣言すると、gc後、「ヒープ」と「ヒープとは別の場所」に1個ずつ文字列のメモリ実体がある
char配列から new String すると、gc後、「ヒープ」に1個だけメモリ実体がある

リテラルで書くとヒープ(String内のプール)とは別の場所にもう一個メモリ実体ができるようですが、これは何でしょうか…?