Java在非阻塞语句之间执行延迟

时间:2014-02-06 04:35:08

标签: java jvm real-time delay nonblocking

我在一个Java程序中遇到了一个奇怪的问题。偶尔一些线程在执行时会延迟最多25秒。这种情况持续1-2分钟,然后应用程序恢复正常处理。这是一个具有严格时间要求的电话应用程序,因此这是不可接受的。

致电班级

    OCSIHandling ocsiHandler = new OCSIHandling(this.arg0);
    ocsiHandler.run();

构造

    public OCSIHandling()
    {
    //This is the last statement of the constructor after initializations
            logger.info("[" + refId + "][OCSI] SMS IDP");
    }

类方法

    run(){
    //This is the first statement of the method which is executed with delay
    logger.info("[" + refId + "][OCSI] in run()");
    }

发布期间的示例日志

INFO 2014-02-07 06:03:27,674 [Thread-143840672] 100 - [MGW070214060327d384] [OCSI]短信IDP INFO 2014-02-07 06:03:49,771 [Thread-143840672] 123 - [MGW070214060327d384] [OCSI] in run()

执行有延迟,49-27 = 22秒

程序正在使用带有32位HotSpot服务器VM的-server选项运行。在此期间,日志记录也会按时间顺序混乱。 1:00:01时间戳写在1:00:00之前。没有线程池。

我们在vmware客户端上使用centos 5.4,64位。应用程序是CPU密集型的,并没有太多内存要求(它运行时默认堆大小为1GB)所以我不确定GC是否会导致这么大的延迟。

记录文件: http://pastebin.com/fpxYBYew

请指出可能导致此类行为的因素。

编辑:这发生在非高峰期

1 个答案:

答案 0 :(得分:1)

你可能遇到垃圾收集问题吗?在运行程序时将以下选项添加到java命令(这些选项将包含在主类名之前或-jar选项之前):-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

这将导致有关要将垃圾收集器性能打印到控制台的详细信息(您可能需要将输出重定向到文件)。有免费程序可用于分析输出,但在您的情况下,只需查找完整的垃圾收集并检查它们所花费的时间就足够了。