>>600
GC前にヒープにいくつも文字列の実体がある原因はわかりました
new String の中で、文字コードの変換のため、配列をコピーしてたりしたので、それが反映されたんだと思います

どの公開されてるコンストラクタを読んでもダメそうだったので、パッケージプライベートなコンストラクタをリフレクションで呼んだら、
GCしなくても、ヒープ上の文字列は1つになりました

var con = String.class.getDeclaredConstructor(byte[].class, byte.class);
con.setAccessible(true);
return con.newInstance(chars, (byte)0);

リテラルを宣言した時に後ろの方のアドレスに出てくる文字列に関してですが、周辺のアドレスのバイナリ列を覗いてみると、.
class ファイルをバイナリエディタで覗いた時と似ていました(完全に同じではない)
Run-time Constant Pool に String のメモリ実体が存在してるようにも思えるんですが、
そのアドレスが本当に Run-time Constant Pool なのかどうかは定かではなく、詳しくはわかりません