Java Hibernate ScrollableResults OutOfMemory

Java Hibernate ScrollableResults OutOfMemory,java,mysql,hibernate,Java,Mysql,Hibernate,我在MySQL数据库中的用户表中有7500行,VM选项:-Xmx8m和下面的一些代码: Query query = session.createQuery("select u from User u"); ScrollableResults resultSet = query.setFetchSize(Integer.MIN_VALUE).setReadOnly(true).scroll(ScrollMode.FORWARD_ONLY); int i = 0;

我在MySQL数据库中的用户表中有7500行,VM选项:-Xmx8m和下面的一些代码:

Query query = session.createQuery("select u from User u");
        ScrollableResults resultSet = query.setFetchSize(Integer.MIN_VALUE).setReadOnly(true).scroll(ScrollMode.FORWARD_ONLY);

        int i = 0;
        while (resultSet.next()) {
            User o = (User) resultSet.get(0);   
            System.out.println(o.getId());    
            i++;
            if (i % 50 == 0) {
                session.clear();
            }
        }
        resultSet.close();
但不幸的是,我的控制台中有这样的输出: ... 5745 线程“main”java.lang.OutOfMemoryError中出现异常:超出GC开销限制


但我不明白为什么??Integer.MIN_值-作为向驱动程序发送的信号,逐行传输结果集。可能我有一个问题,原因是可滚动结果存储在内存中,当内存使用超过Xmx配置时,8m堆不够用。JVM可能会尝试收集垃圾以释放足够的内存,垃圾收集器占用的时间太长。我们出现内存不足异常“
java.lang.OutOfMemoryError:超出了GC开销限制。
”。您必须增加(Xmx)JVM内存的最大量,或者删除JVM标志以使用默认分配。(假设您有足够的物理内存)

C:\>java-X
-Xms设置初始Java堆大小
-Xmx设置最大Java堆大小
-X选项为非标准选项,如有更改,恕不另行通知。
由于这是一个小数据集(7500),mysql JDBC驱动程序应该能够处理这个问题。请注意,最后一批记录不会从会话中清除。即使在ResultSet部分:

默认情况下,结果集完全检索并存储在 内存。在大多数情况下,这是操作和, 由于MySQL网络协议的设计,更容易实现 使生效如果您使用的结果集数量很大 行数或大值,无法在JVM中为 如果需要内存,您可以告诉驱动程序流式传输结果 一次退一排


您必须检查hibernate和JDBC驱动器的版本。

OK。我特别设置了8m的堆大小,因为我想检查ScrollResultSet,它是否真的可以处理大量数据。我没有得到发生OutOfMemory的原因的解释。ScrollableResult存储一些数据对吗?您可以使用“-XX:+heapdumponAutofmemoryError”jvm选项生成内存转储,并分析内存转储我已经完成了,我得到了这个-
C:\>java -X

    -Xms<size>        set initial Java heap size
    -Xmx<size>        set maximum Java heap size

The -X options are non-standard and subject to change without notice.