読者です 読者をやめる 読者になる 読者になる

なかなかどうして、この有様よ。

へたれ系PG/SEの技術系メモ+育児日記。

JavaのString#substringによるメモリリーク。

今の案件では、単体テストフェーズでJTESTを実施するようになっているのですが、
そこでたまに出てくる

CODSTA.EPC.UST
  文字列の構文解析には、'indexOf()' や 'substring()' ではなく 'StringTokenizer' を使用する

という文言。

で、この辺なんでだろうと思ったら、どうもメモリリークを引き起こす可能性があるらしく。

Java - String#substringによるメモリリークの可能性 - Qiita

String#substringは新しい文字列をnew Stringで生成するにも関わらず切り出し前の文字列を内部(のchar配列)で保持してしまっています。

本内容は通常は意識する必要はありませんが、巨大な文字列をsubstring操作する際はメモリリーク等につながる場合がありますので注意が必要です。 (String#splitにも同様の問題があります)

ということだったので、この記事を参考に修正をしました。
実際に直した際はこの書き方に修正。

String s3 = new String(s1.substring(5));

こういうのって「そうなんだー」とは思うけどなかなか「で、なんで?」を調べなかったりするのでメモメモ。