在项目中,在子线程中出现:java.lang.OutOfMemoryError: GC overhead limit exceeded ,而是用exception进行无法捕获异常,因为属于Error,所以只能是用Throwable进行捕获。

   
   
   
   
  1. java.lang.OutOfMemoryError: GC overhead limit exceeded 
  2.         at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1022
  3.         at org.apache.commons.io.IOUtils.copy(IOUtils.java:999
  4.         at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:218
  5.         at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:995
  6. ........................... 

修改方法:

   
 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