4

奇妙な問題があります。大きなテキストフィールドを持つドキュメントを解析しています。私のキャラクターセクションでは、StringBuilderを使用しています

currentStory.append(ch, start, length);

次に、endElementで、オブジェクトの適切なフィールドに割り当てます。

  if (name.equals(tagDesc)) {
     inDesc = false;
     if (currentItem != null ) {
         currentItem.setSummaryText(currentStory.toString());
     }
     currentStory.setLength(0);
  }

setSummaryText(String text)方法は次のとおりです。

    public void setSummaryText(String text) {
      Story = text;
    }

そして、私はメモリが不足しています。

setSummaryTextをこのような完全に奇妙なものに変更すると

public void setSummaryText(String text) {
      char[] local = text.toString()
      Story = new String(local);
   }

私は元気。その参照をどこに保持しているかわからないのですか?Storyは、「」で初期化されたこのオブジェクトのメンバー変数です。注-char[]の代わりにローカル文字列変数への割り当ても失敗します。

4

1 に答える 1

5

メソッドのパフォーマンスの最適化に関係しているのではないかと思いますStringBuffer toString()

Sun javadoc には次のように書かれています。

このメソッドは、文字シーケンスのコピーを保持するために新しいメモリを割り当てずに、新しい String オブジェクトを作成するようにコーディングできます。代わりに、文字列は、文字列バッファーによって使用されるメモリを共有できます。文字列バッファーの内容または容量を変更する後続の操作では、その時点で内部バッファーのコピーを作成する必要があります。この戦略は、文字列バッファを使用して実装されている場合に、文字列連結操作によって割り当てられるメモリの量を減らすのに効果的です。

を で再利用しているためStringBuffersetLength(0)で作成されたすべての文字列への参照を保持している可能性がありますtoString()

交換:

currentStory.setLength(0);

と:

currentStory = new StringBuffer();

それが解決するかどうかを確認します。char[]どちらの場合も新しい配列をString作成する必要があるため、これ以上のオーバーヘッドはないと思いますtoString().

また、 よりStringBuilderも優先されるため、の使用を検討する必要がありますStringBuffer

于 2010-01-06T21:15:37.750 に答える