我用java写的多线程调用kettle的ktr文件,之前是写成bat文件,bat里放ktr文件路径,直接调用bat,是没问题的,
后来,我改成在java里直接调用ktr文件,报java内存溢出 java.lang.OutOfMemoryError:GC overhead limit exceeded
我后台调用ktr代码是这样写的,
public static boolean execute(String filename, String[] params) {
boolean status = true;
try {
System.out.println("进入kettle执行......");
KettleEnvironment.init();// 初始化kettle环境
TransMeta transMeta = new TransMeta(filename);// 转换元对象
Trans trans = new Trans(transMeta);// 转换
// trans.prepareExecution(null);// 异常处理
trans.execute(params);
// 等待转换执行结束
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
status = false;
throw new RuntimeException("kettle运行错误");
}
log.debug("执行kettle结束!..." + filename);
} catch (KettleException e) {
e.printStackTrace();
try {
throw e;
} catch (KettleException e1) {
e1.printStackTrace();
}
} finally {
}
return status;
}
数据量大的时候,10个线程同时跑,就会报
java.lang.OutOfMemoryError:Java heap space
at net sourceforge.jtds.util.BlobBuffer.getBytes()
和java.lang.OutOfMemoryError:GC overhead limit exceeded
at java.nio.ByteBuffer.wrap
报以上两种错误
请有这方面经验的高手指点,不胜感谢!
java多线程调用ktr文件内存溢出java.lang.OutOfMemoryError:GC overhead limit exceeded
答案:2 悬赏:50
解决时间 2021-02-28 20:16
- 提问者网友:神仙爷爷
- 2021-02-28 10:16
最佳答案
- 二级知识专家网友:萌萌哒小可爱
- 2021-02-28 11:52
两种方案:1.把Java虚拟机的内存设大点;2.手动释放内存机制,而不是执行完之后由Java虚拟机统一释放
全部回答
- 1楼网友:晚安听书人
- 2021-02-28 13:05
额
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯