0

我有 Postgres DB,客户端表中有 7500 行,-Xmx8m。

 Query query = session.createQuery("select c from Client c");
ScrollableResults resultSet = query.setFetchSize(50).setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
    int i = 0;

    while (resultSet.next()) {
        Client client = (Client) resultSet.get(0);
        System.out.println(client.getId());
        i++;
        if (i % 50 == 0) {
            session.clear();
            Thread.sleep(500);
        }
    }
    session.clear();
    resultSet.close();

当我运行我的应用程序时,我得到了这个: .... 4188 java.lang.OutOfMemoryError: GC 开销限制超出

然后我设置了 -Xmx1024m 并运行 jvisualvm 并得到了这个 -

在此处输入图像描述 为什么我有很多字符串????谁能解释为什么会发生 OutOfMemory ?

4

1 回答 1

-2

因为它是一个有状态的会话。对象不会被驱逐。除了session.clear()做电话 session.flush()。由于其有状态会话,由于休眠的一级缓存,所有对象都将在内存中。

否则使用无状态会话

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html

于 2015-07-02T05:41:42.507 回答