Java 启动时生成大量EHCache线程 更新:仍然困惑。我认为唯一的可能性是在生成线程后在init方法内部抛出异常,但没有记录异常。我捕获create方法中抛出的所有异常,并将它们记录到警告日志中。有人知道为什么Log4J不能打印我的日志消息吗?日志记录级别设置为警告。

Java 启动时生成大量EHCache线程 更新:仍然困惑。我认为唯一的可能性是在生成线程后在init方法内部抛出异常,但没有记录异常。我捕获create方法中抛出的所有异常,并将它们记录到警告日志中。有人知道为什么Log4J不能打印我的日志消息吗?日志记录级别设置为警告。,java,concurrency,ehcache,Java,Concurrency,Ehcache,我正在JBoss上使用EHCache运行Spring3.0应用程序。有时,当我启动应用服务器时,JVM会在20或30秒内完全关闭。我将其设置为每5秒进行一次线程转储,发现在大约15秒后,该线程的转储开始以指数形式增大: "net.sf.ehcache.CacheManager@7d73124b" daemon prio=10 tid=0x00002aac1426a000 nid=0x2300 in Object.wait() [0x00002aac0d886000] java.lang.T

我正在JBoss上使用EHCache运行Spring3.0应用程序。有时,当我启动应用服务器时,JVM会在20或30秒内完全关闭。我将其设置为每5秒进行一次线程转储,发现在大约15秒后,该线程的转储开始以指数形式增大:

"net.sf.ehcache.CacheManager@7d73124b" daemon prio=10 tid=0x00002aac1426a000 nid=0x2300 in Object.wait() [0x00002aac0d886000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00002aaaf5c556e0> (a java.util.TaskQueue)
    at java.lang.Object.wait(Object.java:485)
    at java.util.TimerThread.mainLoop(Timer.java:483)
    - locked <0x00002aaaf5c556e0> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:462)
每5秒进行一次线程转储,我可以看到这些线程成倍增加时的堆栈跟踪。同步块中始终有一个线程,该线程已到达构造函数并将生成一个线程。然后总是有几个线程等待进入同步块

据我所知,对同步块内的singleton进行null检查应该可以防止多个条目进入构造函数,但不知何故,每个线程似乎都发现singleton为null。我将所有异常记录到警告日志中,因此我认为如果在构造函数中创建线程后引发异常,我会在日志中看到它。我没有看到任何警告,但我验证了这会导致这种行为


有人知道多个线程如何到达该构造函数吗?java会缓存空检查吗?因为它刚刚在前一行对同一字段进行了空检查?

查看线程转储,看起来真正的问题可能是计时器运行异常,这会不断生成访问缓存管理器的线程。我想我应该首先检查您的代码,以验证您没有启动等待时间为0的计时器可能是错误的时间偏移计算的结果。

如果这是缓存管理器init生成的线程,那么它们可能是线程在ehcache站点监视版本更新,尽管我不能确定。可以使用Terracotta的runtime属性“我不记得它的名称”或缓存配置设置某些XML属性或Spring setter来抑制这些检查,具体取决于缓存配置的定义方式。

正在尝试创建现有单例。已返回现有的singleton。

谢谢,但我已经禁用了更新检查器。这是一个检查更新的线程,但它没有指出有多少更新被创建。我不知道为什么有那么多更新从未被创建过。但是,如果这是更新检查线程,那么我再次思考,不确定您是否可以阻止它的创建。我有一种感觉,我在回答中提到的这两个设置中的一个在线程创建之后很晚就应用了。即使有一个计时器不断访问缓存管理器,它也是作为单例实现的。你应该能够访问它,因为你需要很多次。奥卡姆的剃须刀可能会帮助你
public static CacheManager create() throws CacheException {
    if (singleton != null) {
        return singleton;
    }
    synchronized (CacheManager.class) {
        if (singleton == null) {
            LOG.debug("Creating new CacheManager with default config");
            singleton = new CacheManager();
        } else {
            LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
        }
        return singleton;
    }
}