2012-08-04 37 views
1

我正面临java.lang.OutOfMemoryError: Java heap space。一些大量的数据转换成toString()。我有自己的toString代码实现。你可以看到下面的代码:OutOfMemoryError:将一些批量数据转换为toString时的Java堆空间()

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。如果我增加堆空间,我只能推迟一些日子内存不足。在这种情况下有什么办法来优化代码吗?

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

+0

请检查下面的公共字符串的ToString我的代码的toString(){ 尝试{ 如果(!localBase64Binary = NULL){ ByteArrayOutputStream OUT =新ByteArrayOutputStream(); localBase64Binary.writeTo(out); return out.toString(“utf-8”); (IOException ex){ ex.printStackTrace(); } return null; } – user1575538 2012-08-04 03:43:31

+1

请修改您的帖子以包含代码。 – Antimony 2012-08-04 03:45:44

+0

@user请仅发布有问题的代码,并使用编辑器窗口中存在的{}标签格式化代码。 – Mahesh 2012-08-04 03:49:03

回答

3

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

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

1

代替生成一个大字符串并传递给别的东西来做某事,你需要处理生成的数据。

例如而不是

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

new LargeData(objData).writeTo(out); 

,因为这将同时使用更少的内存。

相关问题