這是我對S.O.的第一個問題。
我有一個很奇怪的問題。
下面是我的問題...java進程被凍結(?)在linux上
我寫了一個非常簡單的方法,寫一些文本到一個文件。
當然它運作良好,我的機器(XP,4CPU,jdk1.5.0_17 [SUN])
但somtimes凍結運行服務器
(Linux的Accounting240 2.4.20-8smp上,4CPU, jdk1.5.0_22 [SUN])。
kill -3不起作用。
ctrl + \不起作用。
所以,我不能告訴你線程轉儲。
凍結以及.. 當我就在這個方法寫一些了Thread.sleep(XX),問題就順利(?)...
睡眠(XX)破......它再次發生今天與Thread.sleep(XX)...
你知道這個問題嗎? 你有一些解決方案嗎? 謝謝。 :-)
P.S.
linux發行版:Red Hat Linux 3.2.2-5
命令:java -cp。牛逼
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class T {
private BufferedWriter writer = null;
private void log(String log) {
try {
if (writer == null) {
File logFile = new File("test.log");
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(logFile, true)));
}
writer.write(new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss] ")
.format(new Date()));
writer.write("[" + log + "]" + "\n");
writer.flush();
/*
* this is ad hoc solution ???
*/
//Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
public void test() {
long startTime = System.currentTimeMillis();
while (true) {
log(String.valueOf(System.currentTimeMillis()));
System.out.println(System.currentTimeMillis());
try {
//Thread.sleep((int) (Math.random() * 100));
} catch (Exception e) {
break;
}
if (System.currentTimeMillis() - startTime > 1000 * 5) {
break;
}
}
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
}
}
System.out.println("OK");
}
public static void main(String[] args) {
new T().test();
}
}
如果你想做日誌記錄,我強烈建議你使用現有的日誌記錄框架,如果這是一個對你開放的選項。記住log4j或slf4j。 – Buhb 2009-12-09 08:14:29
或java.util.logging。附帶您的JDK。 – Thilo 2009-12-09 08:26:01
在我的雙核Ubuntu AMD64計算機(Sun的「服務器」虛擬機)上運行5次後無法重現。 Java版本 「1.6.0_0」 OpenJDK的運行時環境(IcedTea6 1.6.1)(6b16-1.6.1-3ubuntu1) OpenJDK的64位服務器VM(建14.0-B16,混合模式) – 2009-12-09 08:29:15