問題:使用EhCache按期更新數據庫時,每隔幾天,Tomcat拋下面異常,致使更新失敗.java
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in class path resource [configs/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: unable to create new native threadspring
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.moonbasa.erp.analytics.abtest.cache.EhCacheEventListener.notifyElementExpired(EhCacheEventListener.java:31)
at net.sf.ehcache.event.RegisteredEventListeners.notifyListener(RegisteredEventListeners.java:286)
at net.sf.ehcache.event.RegisteredEventListeners.invokeListener(RegisteredEventListeners.java:272)
at net.sf.ehcache.event.RegisteredEventListeners.internalNotifyElementExpiry(RegisteredEventListeners.java:208)
at net.sf.ehcache.event.RegisteredEventListeners.notifyElementExpiry(RegisteredEventListeners.java:186)
at net.sf.ehcache.Cache.notifyRemoveInternalListeners(Cache.java:2160)
at net.sf.ehcache.Cache.removeInternal(Cache.java:2148)
at net.sf.ehcache.Cache.tryRemoveImmediately(Cache.java:1960)
at net.sf.ehcache.Cache.searchInStoreWithoutStats(Cache.java:1937)
at net.sf.ehcache.Cache.get(Cache.java:1555)
at net.sf.ehcache.Cache.get(Cache.java:1522)
at com.moonbasa.erp.analytics.abtest.servlets.CountServlet.doGet(CountServlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:317)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1544)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at java.util.Timer.<init>(Timer.java:154)
at net.sf.ehcache.util.FailSafeTimer.<init>(FailSafeTimer.java:52)
at net.sf.ehcache.CacheManager.init(CacheManager.java:369)
at net.sf.ehcache.CacheManager.<init>(CacheManager.java:289)
at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:112)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 41 more數據庫
可能緣由:apache
"該異常由棧中拋出, 代表棧中無可用內存來服務線程。而JVM的內存大體可分爲(這裏不夠嚴謹)內存數據區(包括Stack)+對象堆區,因爲JVM實例進程尋址是必定的。因此二者此消彼漲的關係,對於32位的機子, JVM整個實例可用內存不到3G,加上個人Heap Size 設置了2G,留給數據區只有1G不到, 當時系統跑了大概500+的線程, 按照JDK1.5以來, 每一個線程棧的大小爲1M, 這樣算出溢出就差很少了。"tomcat
----轉自互聯網app
解決辦法:
spa
1.減少-Xss512k: 設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內 存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。操作系統
2.減少-Xms512m -Xmx512m.net
3.升級CPU至64位
線程