起床搬砖 2021-12-20 10:54 采纳率: 0%
浏览 14
已结题

TimerTask+POI的内存问题

在TimerTask下循环POI读取Excel遇到了一个内存问题,正常情况下POI读取完Excel后方法结束内存也就回收了,但是放到TimerTask下,读取完这一次后内存并未回收,如下图所示;

img

现在有什么办法可以让这个循环定时任务执行的同时每次读取完后正常结束内存呢?
代码如下:

package com.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.zutil.Util;

public class test {

    public static void main(String[] args) {
        cronJob();
    }

    public static void cronJob() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                Workbook wb = null;
                Sheet sheet = null;
                Row row = null;
                String cellData = null;
                String filepath = "Test.xlsx";

                wb = readExcel(filepath);
                if (wb != null) {
                    sheet = wb.getSheetAt(0);
                    int rownum = sheet.getPhysicalNumberOfRows();
                    row = sheet.getRow(0);
                    int colum = sheet.getPhysicalNumberOfRows();

                    for (int j = 1; j < rownum; j++) {
                        row = sheet.getRow(j);
                        if (row != null) {
                            for (int k = 0; k < colum; k++) {
                                cellData = (String) Util.getCellFormatValue(row.getCell(k));
                            }
                        } else {
                            break;
                        }
                    }
                }
            }
        }, 0, 10 * 1000);
    }

    public static Workbook readExcel(String filePath) {
        Workbook wb = null;
        if (filePath == null) {
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            if (".xls".equals(extString) || ".XLS".equals(extString)) {
                return wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(extString) || ".XLSX".equals(extString)) {
                return wb = new XSSFWorkbook(is);
            }
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }

    public static Object getCellFormatValue(Cell cell) {
        Object cellValue = null;
        DecimalFormat df = new DecimalFormat("#.#########");
        if (cell != null) {
            // 判断cell类型
            switch (cell.getCellType()) {
            // 数字
            case Cell.CELL_TYPE_NUMERIC: {
                cellValue = df.format(cell.getNumericCellValue());
                break;
            }
            // 公式
            case XSSFCell.CELL_TYPE_FORMULA: {
                try {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                } catch (IllegalStateException e) {
                    cellValue = String.valueOf(cell.getRichStringCellValue());
                }
                break;
            }
            // 字符串
            case HSSFCell.CELL_TYPE_STRING: {
                cellValue = cell.getStringCellValue();
                break;
            }
            // 空值
            case HSSFCell.CELL_TYPE_BLANK: {
                cellValue = "";
                break;
            }
            default: {
                cellValue = "";
                break;
            }
            }
        }
        return cellValue;
    }
}
  • 写回答

1条回答 默认 最新

  • 起床搬砖 2021-12-20 14:57
    关注

    补充:
    刚才我用EasyExcel测试了下,发现虽然占用内存较小,但是会随着每次定时任务的执行而增加,所以我猜测跟哪个工具类读取Excel没多大关系,主要是TimerTask每次执行没有回收内存。道友们看看有没有优化TimerTask的方法或者其他简单的定时框架来实现这个需求。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 创建了问题 12月20日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图