問題現象
循環中每行調用 Service 獲取 Page 對象,再寫入單元格,數據量大時 OOM(500 錯誤)。
優化要點
- 輕量級 DTO 替代 Page:Service 返回
List<Map> 或自定義簡單 POJO,僅包含導出所需字段,避免 Page 內部持有大量無關數據(總頁數、總條數、分頁參數等)。
- 參數精簡:方法簽名僅傳必要參數(如
rowIndex, pageSize),避免傳遞大 Map、Page 等重對象。
- 對象復用:循環外創建
List<Map> list = new ArrayList<>(),循環內 list.clear() 復用,減少 GC 壓力。
- 流式寫入:使用
SXSSFWorkbook (POI 流式 API) 邊生成邊刷盤,不佔用堆內存。
- 批次提交:每 1000 行刷新一次
sheet.flushRows()。
重構示例
// Service 簽名優化
List