一種unable to create new native thread問題

問題:使用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位
線程

相關文章
相關標籤/搜索