当前位置: 首页 > 知识库问答 >
问题:

堆内存不足,java

缪宪
2023-03-14

我是刚到爪哇的。我只是试图了解如何处理堆内存溢出及其原因。有人能在下面的代码中帮助我为什么它会抛出这个错误吗。我怎么能避免。

错误:

线程“main”Java.lang.OutOfMemoryError中出现异常:Java.util.arrays.copyof(arrays.Java:2361)在Java.lang.AbstractStringBuilder.ExpandCapacity(AbstractStringBuilder.Java:117)在Java.lang.AbstractStringBuilder.Append(AbstractStringBuilder.Java:406)在Java.lang.StringBuffer.Append(StringBuffer.Java:237)在com.ugam.qa.title.xlsxtocsv.xlsx

package com.ugam.qa.tittle;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxToCsv {

    static void xlsx(File inputFile, File outputFile) {
        // For storing data into CSV files
        StringBuffer data = new StringBuffer();

        try {
            FileOutputStream fos = new FileOutputStream(outputFile);
            // Get the workbook object for XLSX file
            XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(inputFile));
            // Get first sheet from the workbook
            XSSFSheet sheet = wBook.getSheetAt(0);
            Row row;
            Cell cell;
            // Iterate through each rows from first sheet
            Iterator<Row> rowIterator = sheet.iterator();

            while (rowIterator.hasNext()) {
                row = rowIterator.next();
                {
                // For each row, iterate through each columns
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {

                    cell = cellIterator.next();

                    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_BOOLEAN:
                            data.append(cell.getBooleanCellValue() + ",");

                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            data.append(cell.getNumericCellValue() + ",");

                            break;
                        case Cell.CELL_TYPE_STRING:
                            data.append(cell.getStringCellValue() + ",");
                            break;

                        case Cell.CELL_TYPE_BLANK:
                            data.append("" + ",");
                            break;
                        default:
                            data.append(cell + ",");

                    }
                    data.append("\r\n");
                }}
            }

            fos.write(data.toString().getBytes());
            fos.close();

        } catch (Exception ioe) {
            ioe.printStackTrace();
        }
    }
    //testing the application 

    public static void main(String[] args) {
        //reading file from desktop
        File inputFile = new File("D:\\files\\listing\\test.xlsx");
        //writing excel data to csv 
        File outputFile = new File("D:\\files\\listing\\test1.csv");
        xlsx(inputFile, outputFile);

    }
}

共有1个答案

陈宏胜
2023-03-14

增加堆是一种解决方案:java-xmx m

更好的解决方案是使用更少的内存,这在您的情况下很容易:为什么要在将整个输出转储到流中之前将其存储在StringBuffer中?在找到每个部分时直接将它们写入流会更节省内存。

对代码的另一个改进是使用FileWriter而不是FileOutputStream:它允许您控制输出编码,并直接接受字符串,而不需要您调用String#GetBytes()

 类似资料:
  • 问题内容: 今天,我运行了用于文件系统索引编制的脚本,以刷新RAID文件索引,并在4小时后崩溃并出现以下错误: 服务器配备16GB RAM和24GB SSD交换。我非常怀疑我的脚本是否超过了36gb的内存。至少不应该 脚本使用文件元数据(修改日期,权限等,无大数据)创建存储为对象数组的文件索引 过去,我曾经用此脚本经历过奇怪的节点问题,这使我不得不这样做。在处理诸如String之类的大文件时,由于

  • 我已经经历了奇怪的节点问题在过去与这个脚本迫使我。在处理像String这样的大文件时,node会出现故障,将索引拆分为多个文件。有什么方法可以改进nodejs的内存管理与庞大的数据集?

  • 问题内容: 运行时出现以下错误: 严重错误:CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足 有没有办法全局增加node.js内存限制? 问题答案: 您可以使用以下命令启动NPM: 如所描述的在这里,默认为4000(4GB)。

  • 上面链接中的代码正在工作,但可以传输到一定数量的数据。当我试图传输一个大小约为334 MB的.mkv格式的电影时,它给出了“内存不足,java堆大小”的错误。我是一个乞丐,我不知道如何解决这个问题,我试图在客户端程序中增加缓冲区大小,但问题仍然存在。请帮帮我.

  • 安全上下文:000001af8a2cfb61 2:/*匿名*/[C:\project_folder\node_modules\source-map\lib\source-node.js:100][pc=0000016e99866533](this=00000346870554e1,mapping=000003c18fdc93c9)3:参数适配器框架:3->1 4:InnerArrayForEach