在项目中,在子线程中出现:java.lang.OutOfMemoryError: GC overhead limit exceeded ,而是用exception进行无法捕获异常,因为属于Error,所以只能是用Throwable进行捕获。
java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1022)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:218)
at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:995)
...........................
修改方法:
scheduledService = new ScheduledThreadPoolExecutor(1);
ReBuildJob job = new ReBuildJob();
job.setUncaughtExceptionHandler( new UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Throwable e) {
logger .error("Thread down, name:'{}', Exception {}" ,t.getName(), e);
}
});
scheduledService .scheduleAtFixedRate(job, UnicornConstant.TIMER_DELAY ,
UnicornConstant. TIMER_INTERVAL , TimeUnit. MILLISECONDS);
使用Throwable e进行捕获
for (File file : cssFiles) {
try {
iteratorHandle(resourceReader, file, versionList);
} catch (Throwable e) {
logger.error( "Note: load css file '{}' exception, {}" , file, e);
}
}
其他建议:
java.lang.OutOfMemoryError: GC overhead limit exceeded解决
一、异常如下:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
二、解释:
JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
一般是因为堆太小。导致异常的原因:没有足够的内存。
三、解决方案:
1、查看系统是否有使用大内存的代码或死循环。
2、可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit