StringBuilder 導致堆內存溢出


StringBuilder 導致堆內存溢出

原始問題描述:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3332)
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
	at java.lang.StringBuilder.append(StringBuilder.java:136)
	at testpkg.Main.decDfs(Main.java:230)


定位到問題點:

/**
 * For positive values of {@code minimumCapacity}, this method
 * behaves like {@code ensureCapacity}, however it is never
 * synchronized.
 * If {@code minimumCapacity} is non positive due to numeric
 * overflow, this method throws {@code OutOfMemoryError}.
 */
private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0) {
        value = Arrays.copyOf(value,
                              newCapacity(minimumCapacity));
    }
}

問題的原因在於無腦 append 的時候,擴充內存使得 StringBuilder 的長度超過了上限觸發OOM,查看后發現 StringBuilder 實際能使用的大小和 JVM 。

解決方法:

  • 調大JVM參數,因為StringBuilder有時候沒有到達上限,由於JVM堆空間太小,也會觸發OOM
  • 重新計算最大所需空間,增加 StringBuilder 數量,提前分散放置字符串
  • 提前序列化部分結果,但是效率很低


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM