当没有人观看时,软件会做什么?(关于Java无响应程序)
从我上小学开始,我就一直在想这个问题,现在我想我已经面临了一个现实生活中的情景。2条连续日志语句中存在无法解释的延迟,详情如下: 我将slf4j与logback一起使用,以下是我在日志中得到的信息:当没有人观看时,软件会做什么?(关于Java无响应程序),java,multithreading,logging,thread-safety,Java,Multithreading,Logging,Thread Safety,从我上小学开始,我就一直在想这个问题,现在我想我已经面临了一个现实生活中的情景。2条连续日志语句中存在无法解释的延迟,详情如下: 我将slf4j与logback一起使用,以下是我在日志中得到的信息: INFO 2014-01-15 01:01:12,215 [Thread-38005034] 185 - REQ Rcvd:68506950 INFO 2014-01-15 01:01:34,183 [Thread-38005035] 123 - [MGW150114010112fc1b][OC
INFO 2014-01-15 01:01:12,215 [Thread-38005034] 185 - REQ Rcvd:68506950
INFO 2014-01-15 01:01:34,183 [Thread-38005035] 123 - [MGW150114010112fc1b][OC]923029563761->8803026062143 rDialogID: 68506950
这两行的打印不应有时间延迟,但第二行的打印时间超过20秒
这是我的密码:
public void onRequest(final DPRequest arg0) {
new Thread() {
@Override
public void run() {
Request idp = new Request();
idp.arg0 = arg0;
Thread dpThread = new Thread(idp);
dpThread.start();
logger.info("REQ Rcvd:" + arg0.getId());
}
}.start();
}
这是请求类
@Override
public void run() {
processdp();
}
public void processdp() {
OCHandling ocsiHandler = new OCHandling(this.arg0);
ocHandler.run();
}
这是OCHandling课程
public void run() {
logger.info("[" + refId + "][OC]" + PNumber + "->" + CNumber + " rDialogID: " + arg0.getId());
}
onRequest函数每秒接收近50个请求,这是我第一次看到如此大的延迟,而且只发生了不到一分钟,您认为问题出在哪里
原来是压实问题
以前从未听说过,我想不出gc在收集未引用内存时需要停止所有其他线程的原因,但是读到这一点,它解决了这个谜。感谢您指向gc,这导致了这种压缩现象。可能是垃圾收集器吗?这是在运行一段时间后发生的吗?GC花费了太多的时间来清理是否有任何引用?是否有太多的线程在运行?@Vijay:是的,线程正在运行,但我正在寻找任何可靠的引用或源,如果线程数量过多,则可能存在已知问题,我看到的最大线程数约为500个,可能是IO问题。如果没有看到所有的代码,就很难说清楚。你的应用程序IO密集吗?除了日志记录,我是说。。。我建议您传入自己的(字符串)时间戳,看看是否看到相同的行为。我会添加更多的日志记录(在线程创建之前/之后等),以查看是否有特定的行运行缓慢。。。