`

Hibernate StackOverFlowError 异常出现的原因

阅读更多

引起StackOverFlowError异常的一般是因为在程序中递归调用是栈溢出造成的,而在Hibernate 的HQL执行包含有 in  

或者 or的语句时

不论是使用 where x in(:x) 还是使用 where x in
(1,2,3…)的方式,如果引用的参数超过堆栈空间,都会引发堆栈溢出异常。在大多数的JVM中,参数限制在9000~10000之间。

堆栈溢出的原因在于org.hibernate.hql.ast.util.NodeTraverser在解析语法树的时候采用了递归算法,大量的 in参数会生成一个的子树,子树的深度和in参数的个数相同。解决方法是使用迭代的方式代替递归树,这样就不会耗尽堆栈。在Hibernate
3.2.x以上版本已经解决了这个问题。

分享到:
评论

相关推荐

    如何解决java.lang.StackOverflowError

    在Java编程中,`java.lang.StackOverflowError` 是一个常见的运行时异常,它通常发生在程序执行过程中,当Java虚拟机(JVM)的调用栈溢出时。调用栈是每个线程用来存储方法调用信息的数据结构,当递归调用过深或者...

    系统稳定性——StackOverFlowError常见原因及解决方法1

    【系统稳定性——StackOverFlowError常见原因及解决方法】 在Java编程中,系统稳定性是至关重要的,而StackOverflowError是一个常见的运行时错误,通常由于内存管理问题导致。本篇文章将详细探讨StackOverflowError...

    Java中内存异常StackOverflowError与OutOfMemoryError详解

    Java中内存异常StackOverflowError与OutOfMemoryError详解 Java中内存异常StackOverflowError与OutOfMemoryError是两种常见的错误类型,它们都是 Java 虚拟机(JVM)在运行时可能遇到的问题。本文将详细介绍这两种...

    稳定性专题 | StackOverFlowError 常见原因及解决方法

    如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出 java.lang.StackOverflowError 错误。 线程栈是如何运行的? 首先给出一个简单的程序调用代码示例,如下所示: public class...

    Java常见异常集-Java,Hibernate,Tomcat异常

    8. **StackOverflowError**:当栈空间耗尽,无法分配新的栈帧时抛出。这可能源于递归调用过深或无限循环。优化算法以减少栈的使用,或者增加JVM的栈大小(-Xss参数)。 9. **SocketException: Unexpected end of ...

    JsonConfigUtil

    去除死循环,解决StackOverflowError错误

    manytomany关系

    在Java持久化框架Hibernate中,ManyToMany关系是一种重要的关联类型,它表示两个实体类之间可能存在多个实例互相关联的情况。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就是典型的...

    java内存机制及异常处理

    常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间不足)和`java.lang.StackOverflowError`(栈溢出)。这些错误通常由于物理...

    Java常见异常类型及原因分析(下).pdf

    堆栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)是另外两种在Java开发中需要注意的异常。堆栈溢出通常在递归调用中发生,当递归深度过大,超过了JVM堆栈所能容纳的最大深度时,就会抛出这个异常。而...

    Java\课件\JAVA的异常处理机制.ppt

    - **Error**:表示系统级错误或虚拟机错误,如`OutOfMemoryError`、`StackOverflowError`等,一般不应在应用程序中捕获或处理。 6. **异常类的子类**: - `RuntimeException`子类包括`ArithmeticException`(算术...

    android异常类型和处理

    Java语言提供了一套完善的异常处理机制,使得开发者能够有效地捕获和处理程序运行过程中可能出现的各种问题。本文将详细探讨Android中常见的异常类型以及如何进行异常处理。 首先,异常在Java中被分为三大类:运行...

    Android-在项目崩溃时获取异常自动联网在StackOverflow百度或其他平台上寻找回答链接和详情

    捕获到的异常信息包括堆栈跟踪、设备信息、用户环境等,这些信息对于理解异常的原因至关重要。 然后,项目会利用这些异常信息进行网络搜索。Stack Overflow是一个程序员问答社区,其中包含了丰富的技术问题和解决...

    03-Java异常面试题.docx

    StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。这些错误是不受检异常,非代码性错误。 Exception(异常)是程序本身可以捕获并且可以处理的异常。Exception 又分为两类:运行时异常和编译时...

    解决返回JSON报错:HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowE

    然而,当出现"HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)"这样的错误时,意味着在序列化过程中遇到了无限递归的问题。这个问题通常是由于对象之间的引用循环...

    Java开发常见错误及解决方案文件

    - 错误信息:编译器报错提示无法初始化pagecontext,异常为java.lang.StackOverflowError。 - 原因分析:在接口Rollable中定义的成员变量ball的引用被改变了,但接口中的成员变量默认是public static final的,即...

    JVM实战-对象访问与内存溢出异常解析

    3. **掌握虚拟机栈和本地方法栈内存溢出异常的测试**:探究如何通过递归调用或其他手段导致栈深度超出限制,触发`StackOverflowError`异常;同时,尝试通过增加线程数量的方式模拟栈内存不足的情况,从而引发`...

    Java常见异常大全.pdf

    文档中还提到了很多其他的异常类型,例如AbstractMethodError、AssertionError、ClassCircularityError、ClassFormatError、Error、ExceptionInInitializerError、IllegalAccessError、IncompatibleClassChangeError...

    Java中常见异常类型及分析.pdf

    堆栈溢出(`StackOverflowError`)和内存溢出(`OutOfMemoryError`)是两种常见的错误级别异常。前者发生在递归调用深度过大导致堆栈空间耗尽时;后者发生在内存不足,无法分配新的对象时。 **产生原因:** - **堆栈...

    Java异常面试题全部资源

    对于Error,程序通常无法进行处理,如OutOfMemoryError和StackOverflowError。这类错误一旦发生,JVM将终止线程。 Exception(异常)是程序本身可以处理的异常情况。Exception又分为编译时异常(checked exception...

Global site tag (gtag.js) - Google Analytics