1

我面对 java.lang.OutOfMemoryError: Java heap space。一些大容量的数据转换成toString(). 我有自己的toString代码实现。你可以看到下面的代码:

String dataStr = (new LargeData(objData)).toString();

public String toString() 
{ 
    try 
    { 
       if (localBase64Binary != null) 
       { 
           ByteArrayOutputStream out = new ByteArrayOutputStream(); 
           localBase64Binary.writeTo(out); return out.toString("utf-8"); 
       } 
     } 
    catch (IOException ex) 
    { 
       ex.printStackTrace(); 
    } 
    return null; 
}

我正在使用最大堆空间-Xms128m -Xmx256m。如果我增加堆空间,我只能推迟几天内存不足。在这种情况下有什么方法可以优化代码吗?

任何人都可以指导我或帮助我解决这个问题吗?

4

2 回答 2

3

一个问题是动态调整数组大小以添加更多元素。这需要分配一个比现有数组更大的新数组,然后复制元素。如果新数组大于堆空间的一半,则保证失败。

您的问题的解决方案是不使用.toString(). 与其尝试将所有数据保存在 RAM 中,不如将文件流传递给方法并将数据写入磁盘(或将其流式传输到套接字或管道)。

于 2012-08-04T03:55:01.943 回答
1

您需要在生成数据时处理生成的数据,而不是生成一个大字符串并传递给其他东西来做某事。

例如,而不是

String dataStr = (new LargeData(objData)).toString();
out.println(dataStr);

new LargeData(objData).writeTo(out);

因为这将一次使用更少的内存。

于 2012-08-04T08:05:22.543 回答