Что может быть причиной этих ошибок Java? - PullRequest
2 голосов
/ 17 ноября 2011

Кто-нибудь знает, что может быть причиной этих ошибок 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)
>

Ответы [ 6 ]

2 голосов
/ 17 ноября 2011

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

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

1 голос
/ 17 ноября 2011

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 06 августа 2018
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.util.Scanner;

/**
 *
 * @author smart
 */
public class JavaApplication1 {


    public static void main(String[] args) {

        String cname;
        double quantity, price, dp, total, dv, finaltotal;

        Scanner S=new Scanner(System.in); 


        System.out.println("please enter clientname");

        cname=S . nextLine();
        System.out.println("please enter quantity");
        quantity=S . nextDouble();
        System.out.println("please enter price");
        price=S . nextDouble();
        System.out.println("please enter discount percentage");
        dp=S . nextDouble();

        total=S . nextDouble();
        dv=S . nextDouble();
        finaltotal=S . nextDouble();

        total= quantity+price;
        dv= price-dp;
        finaltotal=total*dv;

        System.out.println(total);

        System.out.println(dv);

        System.out.println(finaltotal);           
    }   
}
0 голосов
/ 17 ноября 2011

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

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

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

Кроме того, вы можете увеличить объем памяти Java.

0 голосов
/ 17 ноября 2011

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

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

0 голосов
/ 17 ноября 2011

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

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

...