16

私は String クラス API を調べていましたが、元の String と同じ文字配列を共有しているため、部分文字列メソッドが原因でメモリ リークが発生する可能性があるようです。

元の文字列が巨大な場合、部分文字列によって返される小さな文字列は、Java でのガベージ コレクションから元の文字列 (大きな配列によってバックアップ) を防ぐことができます。

何か考えたり、APIを間違って読んだりしましたか。

4

3 に答える 3

20

かなり大きな文字列の部分文字列を取得し、(通常はコンストラクターを介して) コピーを作成しないと、メモリ リークが発生する可能性あります。String(String)

これはJava 7u6から変更されたことに注意してください。https://bugs.openjdk.java.net/browse/JDK-7197183を参照してください。

flyweight パターンStringを実装するオブジェクトに関する元の仮定は、もはや有効とは見なされません。

詳細については、この回答を参照してください。

于 2013-01-04T16:36:23.067 に答える
4
  1. Java 7u6まではそうでした-通常、次のようにして問題に対処します。

    String sub = new String(s.substring(...)); // create a new string
    

    これにより、依存関係が効果的に削除され、元の文字列が GC で使用できるようになります。ちなみに、これは文字列コンストラクターの使用が理にかなっている唯一のシナリオの 1 つです。

  2. Java 7u6以降、新しい文字列が作成され、メモリの問題はなくなりました。

于 2013-01-04T16:43:06.257 に答える