【问题标题】:Garbage collection doesnt seem to work in java垃圾收集似乎在 java 中不起作用
【发布时间】:2016-03-22 06:01:51
【问题描述】:

下面的方法有 2 个 for 循环。 firstloop 迭代 36000 次,inner forloop 迭代 24 次,所以插入的记录总数为 864000。 代码执行运行近3.5小时并终止。(记录插入失败) 会话关闭和事务提交仅在外部 for 循环结束后进行。执行时发现RAM消耗接近6.9GB

@SuppressWarnings("unchecked")


public void createBRResults() {

    List<BusinessRules> businessRuleList = null;
    Organization organization = null;
    Brresults brresults = null;
    Criteria criteria = null;
    Criteria newCriteria = null;
    String brStatus = "Live";
    Date date = new Date();
    Session session = sessionFactory.openSession();
    Transaction transaction = null;
    try {
        if (callInfos == null) {
            callInfos = getEntities(CallInfo.class);
        }
        for (CallInfo callInfo : callInfos) {
            transaction = session.beginTransaction();
            criteria = session.createCriteria(BusinessRules.class);
            criteria.createCriteria("businessGoals").add(
                    Restrictions.eq("category", callInfo.getCategory()));
            businessRuleList = criteria.list();
            organization = callInfo.getOrganization();
            for (BusinessRules businessRule : businessRuleList) {
                brresults = new Brresults();
                brresults.setBusinessRule(businessRule);
                brresults.setCallInfo(callInfo);
                brresults.setCreatedDate(date);
                brresults.setModifiedDate(date);
                brresults.setOrganization(organization);
                brresults.setBrrStatus(brStatus);
                brresults.setBrrValue(Math.random() < 0.5 ? 0 : 1);
                session.save(brresults);
                brresults = null;
            }
            criteria = null;
            organization = null;
            businessRuleList = null;
            session.flush();
            session.clear();
            transaction.commit();
            System.gc();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        session.close();
    }
}

我已附上最后几行 GC 日志以指示内存分配

17034.595:[全GC(人体工程学)[PSYOUNGGEN:979968K-> 979964K(1862144K)] [PARORDGEN:5576158K-> 5576158K-> 6556126K-> 6556123K(7438336K),[Metaspace:23195K-> 23195K(1071104K )], 2.1041939 secs] [Times: user=8.61 sys=0.00, real=2.11 secs]

17036.699:[全球技术(人体工程学)[psyounggen:979968k-> 979964k(1862144k-> 5576158k-> 6556126k-> 6556123k(7438336k),[Metaspace:23195k-> 23195k(1071104K )], 1.5930338 secs] [Times: user=9.39 sys=0.00, real=1.59 secs] 17038.292:[全核磁共理学(人体工程学)[PSYOUNGGEN:979968K-> 979964K(1862144K)] [5576158K-> 5576158K(5576192K)6556126K-> 6556126K-> 6556122K(7438336K),[Metaspace:23195K-> 23195K(1071104K)], 1.9376959 secs] [Times: user=8.51 sys=0.00, real=1.94 secs]

17040.230:[全gc(人体工程学)[psyounggen:979968k-> 830418k(1862144k-> 5576027k-> 6406445k(7438336K),[Metaspace:23196K-> 23196K(1071104K )], 2.9929302 secs] [Times: user=17.97 sys=0.00, real=3.00 secs]

堆 PSYoungGen 总计 1862144K,已使用 889367K [0x0000000715d80000, 0x00000007bdc80000, 0x00000007c0000000)

伊甸园空间 979968K,已使用 90% [0x0000000715d80000,0x000000074c205e48,0x0000000751a80000) 从空间 882176K, 0% 使用 [0x0000000787f00000,0x0000000787f00000,0x00000007bdc80000) 到空间 885760K,使用 0% [0x0000000751a80000,0x0000000751a80000,0x0000000787b80000) ParOldGen 总计 5576192K,已使用 5576027K [0x00000005c1800000, 0x0000000715d80000, 0x0000000715d80000) 对象空间 5576192K,已使用 99% [0x00000005c1800000,0x0000000715d56d38,0x0000000715d80000) Metaspace used 23223K, capacity 23502K, commited 24064K, reserved 1071104K 类空间使用2443K,容量2537K,承诺2560K,保留1048576K

但如果我关闭会话并为每 24 次迭代再次打开,记录插入成功,所需时间为 55 分钟。但 RAM 利用率约为 3GB。

为什么垃圾回收没有正常进行?代码有哪些错误?

【问题讨论】:

    标签: java garbage-collection out-of-memory batch-insert


    【解决方案1】:

    Session 正在累积对您触摸的所有对象的引用,因为如果您在同一会话中请求两次,它必须返回完全相同的对象。您需要定期关闭它以允许它丢弃其上下文。

    【讨论】:

    • 你是在告诉我每次迭代都关闭会话。如果是这样,那是批量插入的正确方法吗?
    • @sriram 我说要定期关闭它。这可以是每次迭代或某个其他时间间隔,以使您的代码更有意义的为准。您只需要认识到会话保持强大的缓存并考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2015-04-03
    • 2015-01-31
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多