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

非阻塞语句之间的Java执行延迟,java,jvm,real-time,delay,nonblocking,Java,Jvm,Real Time,Delay,Nonblocking,我在我们的一个Java程序中遇到了一个奇怪的问题。偶尔,一些线程在执行过程中会随机延迟25秒。这种情况持续1-2分钟,然后应用程序恢复正常处理。这是一个电话应用程序,具有严格的时间要求,因此这是不可接受的 主叫班 OCSIHandling ocsiHandler = new OCSIHandling(this.arg0); ocsiHandler.run(); 建造师 public OCSIHandling() { //This is the last

我在我们的一个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()");
    }
发布期间的样本日志

信息2014-02-07 06:03:27674[Thread-143840672]100-[MGW070214060327d384][OCSI]SMS IDP 信息2014-02-07 06:03:49771[Thread-143840672]123-[MGW070214060327d384][OCSI]正在运行

执行中存在延迟,49-27=22秒

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

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

日志文件:

请告诉我哪些可能的因素会导致这种行为


编辑:这种情况发生在非高峰时段

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


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

尝试使用探查器。商业(YourKit,jprofiler,…)或VisualVm(免费)是否可以将探查器附加到应用程序jvm。这是您的自定义类还是java.lang.class?新的class()构造函数中发生了什么?由于类不可运行,所以instance.run()可能无法工作,所以您没有向我们显示某些内容。然后连接一个分析器,找出时间的去向。但你必须给出更多的细节才能弄清楚这一点。比如有问题的构造函数的代码和它调用的任何方法,以及关于您正在使用的日志框架的信息和它是如何配置的,等等。哇,我想我不会遇到带有-server jvm参数的低内存需求应用程序的GC问题。将GC更改为G1,问题得到解决-XX:+UseG1GC-XX:MaxGCPauseMillis=400