2

Spring で Web アプリケーションを開発していますが、この奇妙なエラーが発生しました。どこから来たのかわかりません。一生懸命グーグルで検索しましたが、これまでのところ何も見つかりませんでした。

私が使用しているプロジェクトでは、MongoDB、Spring、WSS4J (soap の X.509 セキュリティ ヘッダー)、Apache CXF を使用しています。このエラーの原因となるもの、特定のアクション、動作、条件があるかどうかを調べようとしましたが、これまでのところ何も見つかりませんでした。3 分の実行後に発生することもあれば、3 時間後に発生することもあれば、まったく発生しないこともあります。とヒントをいただければ幸いです。

INFO: Illegal access: this web application instance has been stopped already.  Could not load net.sf.ehcache.store.disk.Segment$1.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1597)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
    at net.sf.ehcache.store.disk.Segment$HashIterator.<init>(Segment.java:988)
    at net.sf.ehcache.store.disk.Segment.hashIterator(Segment.java:936)
    at net.sf.ehcache.store.disk.DiskStore$HashIterator.<init>(DiskStore.java:1038)
    at net.sf.ehcache.store.disk.DiskStore$KeyIterator.<init>(DiskStore.java:1111)
    at net.sf.ehcache.store.disk.DiskStore$KeyIterator.<init>(DiskStore.java:1111)
    at net.sf.ehcache.store.disk.DiskStore$KeySet.iterator(DiskStore.java:949)
    at net.sf.ehcache.store.disk.DiskStorageFactory$DiskExpiryTask.run(DiskStorageFactory.java:838)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)`
4

1 に答える 1

1

これは、アプリケーションが停止または再デプロイされた後に、ehcache スレッドがアプリケーションと対話しようとしていることを意味します。これは、ehcache が ehcache.xml の制限に達し、ディスクにオーバーフローしようとした場合にのみ発生します。

アプリケーションを停止するときの警告については、Tomcat ログを参照してください。

重大: Web アプリケーション [/APP] は [Ehcache_Worker-1] という名前のスレッドを開始したようですが、停止できませんでした。これにより、メモリリークが発生する可能性が非常に高くなります

このようなものが見つかった場合は、ServletContextListener で ecache を適切に停止する必要があります。

public void contextDestroyed(ServletContextEvent servletContextEvent){
      CacheManager.getInstance().shutdown();
}

ehcacheが停止していることを確認するために、おそらく1秒後にスリープします。

http://ehcache.org/documentation/faqで述べたように

Ehcache の使用を停止した後も JVM が実行し続ける場合は、CacheManager.getInstance().shutdown() を呼び出して、スレッドを停止し、キャッシュ メモリを解放して JVM に戻す必要があります。また、shutdown を呼び出すと、永続ディスク ストアが一貫した状態でディスクに書き込まれ、次回の使用時に使用できるようになります。CacheManager がシャットダウンされなくても問題ありません。JVM 終了時にシャットダウンを呼び出すシャットダウン フックがあります。

overflowToDisk="false"または、アプリケーションをデプロイするたびに ehcache.xml でプロパティを設定するか、Tomcat を再起動することができます。

于 2012-08-09T13:26:38.127 に答える