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



  • 相关阅读:
    Java8集合框架——集合工具类Collections内部方法浅析
    Java8集合框架——LinkedHashSet源码分析
    Java8集合框架——HashSet源码分析
    Java8集合框架——LinkedHashMap源码分析
    Spring源码分析(001)——环境搭建
    SpringBoot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
    SpringBoot2(006):关于配置类(Configuration Classes)和自动配置(Auto-configuration)
    SpringBoot2(005):关于工程代码结构的建议
    SpringBoot2(004):关于 Build Systems (构建系统)
    html中的dl,dt,dd标签
  • 原文地址:https://www.cnblogs.com/alter888/p/14475869.html
Copyright © 2020-2023  润新知