循环期间的对象创建

时间:2014-03-04 02:33:28

标签: java performance object memory-management

我遇到了Hibernate的一些性能问题而且我被卡住了。

我有一个嵌套的foreach,它首先遍历地图,然后遍历地图中的每个键以创建一个对象。

for(Map<String, Object> csvRow : csvRows){
    Contact contact  = new Contact();
    contact.setContactId(nextContactId);
    for(String key : csvRow.keySet())
    {
        contact.setDetails(key, csvRow.get(key));
        contactList.addContact(contact);
    }
    nextContactId++;
}

我的问题出现在上面的代码大约需要10秒才能运行。这是一个大约2MB的CSV输入,但该服务必须有效处理200MB(至少)的文件。 我被困的原因是下面的代码运行大约1.6秒,但只创建了一个Contact对象的实例(这很公平),我确实知道为什么会这样。

Contact contact  = new Contact();
for(Map<String, Object> csvRow : csvRows){

    contact.setContactId(nextContactId);

    for(String key : csvRow.keySet())
    {
        contact.setDetails(key, csvRow.get(key));
        contactList.addContact(contact);
    }
    nextContactId++;
}

我已经尝试过通常的事情,例如在处理密钥的每次迭代期间手动将对象的id设置为null。为了使事情更清楚,联系对象不应该代表完整的人,而是代表联系人的一条信息。每个联系人都有相同的contactId,我有一个包装器对象将它们绑在一起,但这与我的问题无关。

我的问题是:如何保持后者的性能,同时仍然创建我需要的所有对象。另外我需要保留我拥有的对象结构,因为我无法控制源CSV,这可能会丢失左右中心的数据,因此我使用的是对象结构。如果您需要更多信息,我会热切地等待您的回复。

编辑#1:使用Hibernate 4.2.8,Spring 3.2.6

1 个答案:

答案 0 :(得分:0)

修正了问题。它实际上不是Hibernate问题而是内存管理问题。请参阅解决方案here