26.10的 gridjs这个返回流是改了吗?导致我用这个不传uid的方法把流返回前端,uid解析出来是null,以前是会给你反uid到前端的
我发现堆外内存other占用过高,请问aspose new Workbook后,需要手动调用wb.dispose()吗?不调用是否会发生内存泄漏
@feng.qun.zhu.avaryholding.com
你使用GridJsService还是GridJsWorkbook
GridJsService 已经是@RequestScope ,在spring系统认为request结束的时候会自动调用dispose方法释放用到的资源,所以无需手动调用。
内部实现是:
GridJsService 的所有api都是封装使用GridJsWorkbook 进行操作,
GridJsService.dispose 会调用GridJsWorkbook .dispose
如果是直接调用GridJsWorkbook 进行操作,他也有dispose 方法,可以手动调用。
你可以打开日志
设置GridJsLogger.setLevel(GridJsLogLevel.DEBUG)
setLogFile 等,这样可以看到创建和销毁对象的具体信息
GridJsWorkbook和Workbook workbook = new Workbook(流);
这两个,都不需要手动调是吗?目前没有任何手动处理
new 完之后,你在GridJs里面怎么用,你把controller里面的请求方法贴出来
这是我们的java demo 像这里面就无需手动操作也会自动释放
Workbook workbook = new Workbook(
new ClassPathResource(TEMPLATE_PATH).getInputStream());
GridJsWorkbook wbj = new GridJsWorkbook();
try {
StringBuilder sb = wbj.getJsonByUid(fileName, fileName);
if (sb == null) {
workbook.calculateFormula();
wbj.importExcelFile(fileName, workbook);
sb = wbj.exportToJsonStringBuilder(fileName);
}
return sb.toString();
} catch (Exception e) {
return "获取文件失败" + e.getMessage();
}
controller就平常的restful post请求,直接返回字符串了
假设在controller里面某个方法
@PostMapping("/xxxapi")
public ResponseEntity<String> updateCell(HttpServletRequest request) {
Workbook workbook = new Workbook(
new ClassPathResource(TEMPLATE_PATH).getInputStream());
GridJsWorkbook wbj = new GridJsWorkbook();
try {
StringBuilder sb = wbj.getJsonByUid(fileName, fileName);
if (sb == null) {
workbook.calculateFormula();
wbj.importExcelFile(fileName, workbook);
sb = wbj.exportToJsonStringBuilder(fileName);
}
return sb.toString();
} catch (Exception e) {
return "获取文件失败" + e.getMessage();
}
......
}
这个应该会自动释放,请求结束,这里面的重资源都是游离状态,随时可以被回收。
你不放心的话,可以监控java内存 抓heapdump文件,对比下
