記一次java.lang.StackOverflowError


javabean 里面屬性過多會導致 (超過800多個)

使用@Data注解

 

 

 

發現是@Data注解 中 @ToString  導致

反編譯后:

 

 

 

StackOverflowError在程序棧空間耗盡時拋出,通常是深度遞歸導致。StackOverflowError繼承了VirtualMachineError類,后者表示JVM已被破壞或資源耗盡。更進一步,VirtualMachineError繼承自Error類,應用程序不應該捕獲這種嚴重的錯誤。不要再throw語句里面拋出這樣的錯誤,因為這些錯誤是不應該發生的異常條件。StackOverflowError從Java 1.0版本就已存在。

StackOverflowError構造函數

StackOverflowError()StackOverflowError(String s),后者的String參數指明了拋出錯誤的類名

 

The StackOverflowError in Java

當一個函數被Java程序調用的時候,就會在調用棧上分配棧幀。

棧幀包含被調用函數的參數、局部變量和返回地址。

返回地址指示了當函數執行完畢之后下一步該執行哪里。如果創建棧幀時沒有內存空間,JVM就會拋出StackOverflowError。

 

每個get方法都要分配棧幀

 

解決方法:

1.

手寫toString方法

toSting方法里不使用get

StringBuilder大小為合適的值,apend字段

/*
 * StringBuffer與StringBuilder有什么區別
 * StringBuilder是JDK5增加的一個新類,功能幾乎與StringBuffer相同。區別在於StringBuffer是線程安全的,
 * 多個線程同時操作StringBuffer時,能保證同步,而Stringbuilder是線程非安全的。如果只在單線程環境下使用,StringBuilder
 * 的效率會更高
 */

 

2.也可以調整也可以Xss 大小

-Xss:規定了每個線程虛擬機棧及堆棧的大小,一般情況下,256k是足夠的,此配置將會影響此進程中並發線程數的大小。

-Xms:表示初始化JAVA堆的大小及該進程剛創建出來的時候,他的專屬JAVA堆的大小,一旦對象容量超過了JAVA堆的初始容量,JAVA堆將會自動擴容到-Xmx大小。

-Xmx:表示java堆可以擴展到的最大值,在很多情況下,通常將-Xms和-Xmx設置成一樣的,因為當堆不夠用而發生擴容時,會發生內存抖動影響程序運行時的穩定性。

 

3.800多個屬性,是否可以從業務上規避

 

 

 

 




免責聲明!

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



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