Что может быть причиной этих ошибок Java?

Кто-нибудь знает, что может быть причиной этих ошибок Java?

Версия Java должна быть 1.4.1_05. Это связано с PeopleSoft.

"VM Thread" prio=5 tid=0x00B8EF28 nid=0x5f8 runnable 
"VM Periodic Task Thread" prio=10 tid=0x00CF4CF8 nid=0x648 waiting on condition 
"Suspend Checker Thread" prio=10 tid=0x00CF5760 nid=0x64c runnable 
<Nov 17, 2011 1:41:46 PM GMT+08:00> <Error> <HTTP> <BEA-101017> <[ServletContext(id=21840659,name=PORTAL,context-path=)] Root cause of ServletException.
java.lang.OutOfMemoryError: unable to create new native thread
                at java.lang.Thread.start(Native Method)
                at bea.jolt.NwHdlr.start_threads(NwHdlr.java:1982)
                at bea.jolt.NwHdlr.openConnection(NwHdlr.java:879)
                at bea.jolt.CMgr.connect(CMgr.java:71)
                at bea.jolt.JoltSession.logon(JoltSession.java:246)
                at bea.jolt.JoltSession.<init>(JoltSession.java:125)
                at psft.pt8.net.JoltSessionWrapper.<init>(JoltSessionWrapper.java:67)
                at psft.pt8.net.JoltSessionPool.createConnection(JoltSessionPool.java:373)
                at psft.pt8.net.JoltSessionPool.getJoltSession(JoltSessionPool.java:220)
                at psft.pt8.net.NetSession.getJoltSession(NetSession.java:484)
                at psft.pt8.net.NetReqRepSvc.sendRequest(NetReqRepSvc.java:526)
                at psft.pt8.net.NetService.requestService(NetService.java:141)
                at psft.pt8.net.NetReqRepSvc.requestService(NetReqRepSvc.java:328)
                at psft.pt8.net.NetSession.connect(NetSession.java:269)
                at psft.pt8.net.NetSession.<init>(NetSession.java:203)
                at psft.pt8.jb.JBEntry.connectWithBlob(JBEntry.java:720)
                at psft.pt8.jb.JBEntry.connect(JBEntry.java:654)
                at psft.pt8.auth.PSAuthenticator.authenticate(PSAuthenticator.java:546)
                at psft.pt8.psreports.onLogin(psreports.java:216)
                at psft.pt8.psreports.onAction(psreports.java:321)
                at psft.pt8.psreports.service(psreports.java:181)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
                at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:971)
                at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:402)
                at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
                at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
                at psft.pt8.psfilter.doFilter(psfilter.java:71)
                at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
                at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6372)
                at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
                at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
                at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3643)
                at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2585)
                at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
                at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
>

person Community    schedule 17.11.2011    source источник
comment
Сколько потоков у вас запущено и сколько памяти вы уже используете?   -  person Jon Skeet    schedule 17.11.2011
comment
трассировка стека говорит об этом довольно хорошо - «OutOfMemoryError»   -  person stratwine    schedule 17.11.2011
comment
Сколько потоков выполняется, когда это происходит? Согласно этому потоку stackoverflow.com/questions/481900/ ограничением является наличие смежных блоков памяти для стека.   -  person Klas Lindbäck    schedule 17.11.2011


Ответы (5)


Вы создаете слишком много потоков для памяти, доступной для стеков потоков. Вы можете уменьшить количество создаваемых потоков или уменьшить размер их стека по умолчанию от (щедрого) значения по умолчанию. -XX:ThreadStackSize=128 сделает его 128 КБ. Конечно, слишком маленький стек, и вы можете получить StackOverflowError (хех), если у вас особенно глубокий вызов метода.

Поскольку вам нужно создать много потоков (тысячи), чтобы достичь этого с размером стека по умолчанию, мое чутье говорит, что ваше лучшее решение — №1. Вам не нужны тысячи потоков в вашем приложении.

person Sean Owen    schedule 17.11.2011

Непосредственной причиной является то, что вашей JVM не хватило памяти для создания стеков для новых потоков.

Первопричину определить сложнее:

  • Приложение может создавать потоки без необходимости или расточительно.

  • Приложение может давать утечку потоков при повторном развертывании.

  • Потоки могут блокироваться при вводе-выводе (например, при чтении сокета) и никогда не возвращаться.

  • В пользовательском пуле потоков могут быть ошибки, которые приводят к потере потоков.

  • Память, необходимая для новых стеков, могла быть занята другими вещами; например кучей или в файлах с отображением памяти или выделением не кучи кодом JNI.

  • И так далее ...

Изменение размера стека потоков — временное решение, которое может сработать. Но в долгосрочной перспективе вам нужно выяснить, что на самом деле вызывает проблему.

Вы можете начать с настройки JVM для создания файла дампа в OOME и использовать анализатор дампа после вскрытия, чтобы увидеть, есть ли какие-либо подсказки; например множество потоков в неожиданных состояниях.

person Stephen C    schedule 17.11.2011

Это сообщение об ошибке обычно означает, что в вашей системе закончился ресурс, необходимый для запуска потока. Обычно это память для стека.

Java 1.4.1 была выпущена в сентябре 2002 года. Возможно, ваша система нуждается в обновлении (возможно, используемое оборудование или версии программного обеспечения).

person Peter Lawrey    schedule 17.11.2011
comment
Я согласен с тем, что JVM следует обновить, но вряд ли это решит насущную проблему. (Кроме того, это сообщение означает, что это определенно память стека.) - person Stephen C; 17.11.2011

Ошибка java.lang.OutOfMemoryError может быть вызвана доступной памятью для вашего приложения или утечками памяти в вашем приложении. Проверьте связанный поток ссылка

JVM выделяет каждому потоку пространство памяти, называемое стеком потоков. Значение по умолчанию зависит от того, какая ОС и JVM. Вы можете попробовать выделить память, выделенную потоку, установив параметр -Xss, а также попробовать уменьшить пространство, выделенное для памяти кучи, параметр -Xmx. В этой статье вы найдете ссылку о настройке JVM.

person questborn    schedule 17.11.2011

Ну, это говорит

java.lang.OutOfMemoryError: unable to create new native thread

так что кажется, что у вас недостаточно памяти. Может быть, старые темы не убиваются, поэтому их становится все больше и больше, пока память не заполнится?

В качестве альтернативы вы можете увеличить объем памяти Java.

person Willem Mulder    schedule 17.11.2011