记一次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多个属性,是否可以从业务上规避

 

 

 

 



posted @ 2021-03-03 17:46  南望孤笑  阅读(1662)  评论(0编辑  收藏  举报