静态初始值设定项中的System.out.println显然输出了两次



在Tomcat上部署的应用程序中,有一个类如下:

import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class ServiceEndpointApplication extends Application {
final static String LOGGER_NAME = "test";
static {
System.out.println("static init start");
Logger logger = Logger.getLogger(LOGGER_NAME);
logger.setLevel(Level.OFF);
System.out.println("static init end");
}
...
}

刚启动Tomcat之后,我就使用JMeter发送了50个请求(50个线程,1个斜坡期,1个循环(。

然后tail -f catalina.out显示以下日志:

Nov 06, 2018 1:36:57 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 64126 ms
static init start
static init end
static init end

static init end显示两次!

这种行为发生的概率约为10%。

我的问题

这种奇怪行为的可能原因是什么?

环境

  • Java

    • java版本"1.7.0_80">
    • Java(TM(SE运行时环境(内部版本1.7.0_80-b15(
    • Java HotSpot(TM(64位服务器虚拟机(内部版本24.80-b11,混合模式(
  • Tomcat 7.0.59

我找到了原因。这是由tail命令的-f选项引起的。

我再现了这种行为:

$ tail -f catalina.out
...
Nov 06, 2018 7:18:17 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 62601 ms
static init start
static init end
static init end

然后我在没有任何选项的情况下运行tail

$ tail catalina.out 
...
Nov 06, 2018 7:18:17 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 62601 ms
static init start
static init end

最新更新