错误java.lang.OutOfMemoryError:java堆空间

错误java.lang.OutOfMemoryError:java堆空间,java,Java,记录可以从网站上获得并显示在屏幕上,或者文件可以以csv格式下载。 当arrayList有超过60000个寄存器时,它会给出错误信息 java.lang.OutOfMemoryError:java堆空间 我做错了什么 这是密码 HTML 函数getFile(){ 成功:功能(数据){ 如果(data.estado==“成功”){ 下载(data.nombre,data.file); } } 函数下载(文件名、数据){ var-element=document.createElement('a')

记录可以从网站上获得并显示在屏幕上,或者文件可以以csv格式下载。 当arrayList有超过60000个寄存器时,它会给出错误信息

java.lang.OutOfMemoryError:java堆空间

我做错了什么

这是密码

HTML

函数getFile(){ 成功:功能(数据){ 如果(data.estado==“成功”){ 下载(data.nombre,data.file); } } 函数下载(文件名、数据){ var-element=document.createElement('a'); element.setAttribute('href',data); setAttribute('download',filename); element.style.display='none'; document.body.appendChild(元素); 元素。单击(); document.body.removeChild(元素); } 爪哇


ArrayList listado=新的ArrayList();
试一试{
listado=dao.getRegistrosFile();
如果(listado.size()>0){
字符串文件=crearArchivo(listado);
json.put(“estado”,“success”);
put(“file”,file);
}
私有字符串crearArchivo(列表)引发异常{
StringBuilder archivo=新的StringBuilder();
用于(对象vo:列表){
archivo.append(vo.getxxx+”;“+vo.getxxxx+”;“+vo.getxxxx+”\n”);
}
byte[]bytesEncoded=Base64.encodeBase64(archivo.toString().getBytes());
字符串文件=csv+新字符串(字节编码);
返回文件;
}
错误


]]ServletException的根本原因。
java.lang.OutOfMemoryError:java堆空间
在java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149)
在java.lang.StringCoding.decode(StringCoding.java:193)
在java.lang.StringCoding.decode(StringCoding.java:254)
位于java.lang.String。(String.java:546)
位于java.lang.String。(String.java:566)
已截断。有关完整的堆栈跟踪,请参阅日志文件
> 

Java程序中可用的内存是有限的,此错误表示程序中所有可能的内存都已用完。Java对象与内存空间绑定,因此当您不断向字符串中添加更多记录时,它占用的空间就越大。根据每条记录的大小,将它们附加到字符串中记忆会很快被吞没

解决这个问题的一个方法是,在遍历记录列表时,将记录分块写入最终文件。这将把部分任务转移到磁盘空间,而不是完全依赖内存

下面是一个使用文件写入的快速示例:

File csv = new File( "xxx" );         
FileWriter writer = new FileWriter( csv );

for (Object vo : list) {
    writer.write(vo.getxxx+";"+vo.getxxxx+";"+vo.getxxxx+"\n");
}

相关:这回答了你的问题吗?只是为了获得一些建设性的反馈,也许一些基于初始代码的示例代码可以帮助OP更好地理解。


    ArrayList<ExcedentesVO> listado = new ArrayList<ExcedentesVO>();
            try{
                listado = dao.getRegistrosFile();
                if(listado.size() > 0){
                    String file = crearArchivo(listado);
                    json.put("estado","success");
                    json.put("file", file);         
                }


        private String crearArchivo(List<ExcedentesVO> list) throws Exception {
            StringBuilder archivo = new StringBuilder();
            for (Object vo : list) {
                archivo.append(vo.getxxx+";"+vo.getxxxx+";"+vo.getxxxx+"\n");
            }

            byte[] bytesEncoded = Base64.encodeBase64(archivo.toString().getBytes());
            String file = csv+new String(bytesEncoded);
            return file;
        }


    ]] Root cause of ServletException.
    java.lang.OutOfMemoryError: Java heap space
        at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149)
        at java.lang.StringCoding.decode(StringCoding.java:193)
        at java.lang.StringCoding.decode(StringCoding.java:254)
        at java.lang.String.<init>(String.java:546)
        at java.lang.String.<init>(String.java:566)
        Truncated. see log file for complete stacktrace
    > 

File csv = new File( "xxx" );         
FileWriter writer = new FileWriter( csv );

for (Object vo : list) {
    writer.write(vo.getxxx+";"+vo.getxxxx+";"+vo.getxxxx+"\n");
}