日期:2014-05-20  浏览次数:20934 次

项目中的守护线程死掉,如何处理
程序抛出的异常信息如下:

Exception in thread "Lucene Merge Thread #10718" java.lang.OutOfMemoryError: class allocation, 64669416888 loaded, 4235051008 footprint JVM@check_alloc (src/jvm/model/classload/classalloc.c:118). 340 byte
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:971)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:965)
        at java.lang.Thread.dispatchUncaughtException(Thread.java:1821)

Exception in thread "Index Commit Thread" java.lang.NoClassDefFoundError: java/lang/ThreadDeath
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:971)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:965)
        at java.lang.Thread.dispatchUncaughtException(Thread.java:1821)

线程描述如下:线程的作用就是每隔一定的时间将内存中的数据写到磁盘上以保证程序使用磁盘在一定范围内,不会内存溢出

代码如下:

private class IndexCommitThread extends Thread{
private boolean flag;
public IndexCommitThread(String name){
super(name);
}

public void run(){
flag = true;
while(flag) {
try {
indexWriter.commit();
System.out.println("commit");
TimeUnit.SECONDS.sleep(indexCommitSeconds);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}


问题如下:在运行过程中,就直接报上面的异常,导致内存中的数据无法写到磁盘上,导致程序运行出错。(程序已经正常运行了20天左右,今天第一次出现这个问题)

求指点,该为题该如何解决?
------解决方案--------------------
一个内存放不下就分开两步做
------解决方案--------------------
你加载了什么,用这么多内存,写文件结束要关闭流
------解决方案--------------------
引用:
Quote: 引用:

一个内存放不下就分开两步做
不是内存放不下,是将内存中的数据写到磁盘中的线程死掉了,今天才发现是 Exception in thread "Lucene Merge Thread #10718" java.lang.OutOfMemoryError 这个错误,好几台机器都没有问题,就其中的一台机器出现了这个问题,这个问题也不知道如何重现。


内存溢出就是内存放不下了啊,如果是自己的算法的话,就换个思路,分而治之;如果不是自己的算法,就调大一点堆内存吧,不知道你堆内存设置的值是多少,32位和64位上限也不一样