2

これらの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)
>
4

6 に答える 6

2

スレッド スタックに使用できるメモリに対して作成するスレッドが多すぎます。作成するスレッドの数を減らすか、デフォルトのスタック サイズを (寛大な) デフォルトから減らすことができます。-XX:ThreadStackSize=128128KBになります。もちろん、スタックが少なすぎるとStackOverflowError、特に深いメソッド呼び出しがある場合にヒットする可能性があります。

デフォルトのスタック サイズでこれを達成するには、多くのスレッド (数千) を作成する必要があるため、私の直感では、最善の解決策は #1 です。アプリに何千ものスレッドは必要ありません。

于 2011-11-17T08:23:25.133 に答える
1

直接の原因は、JVM が新しいスレッドのスタックを作成するためのメモリを使い果たしたことです。

根本原因を特定するのはさらに困難です。

  • アプリケーションがスレッドを不必要に、または無駄に作成している可能性があります。

  • アプリケーションが再デプロイ時にスレッドをリークしている可能性があります。

  • スレッドが I/O でブロックされ (ソケットの読み取りなど)、二度と戻ってこない可能性があります。

  • スレッドが失われる原因となるバグがカスタム スレッド プールに存在する可能性があります。

  • 新しいスタックに必要なメモリは、他のものによって使い果たされている可能性があります。たとえば、ヒープまたはインメモリ マップ ファイルまたは JNI コードによる非ヒープ割り当てによって。

  • 等々 ...

スレッド スタック サイズを微調整することは、短期的にはうまくいくかもしれない応急処置です。しかし、長期的には、何が実際に問題を引き起こしているのかを突き止める必要があります。

まず、JVM を構成して OOME にダンプ ファイルを作成し、事後分析ダンプ アナライザーを使用して手がかりがあるかどうかを確認する必要があります。たとえば、予期しない状態のスレッドが多数あります。

于 2011-11-17T08:48:35.890 に答える
0

java.lang.OutOfMemoryErrorは、アプリケーションで使用可能なメモリが原因で発生する可能性があります。また、アプリケーションのメモリリークが原因で発生する可能性もあります。関連するスレッドリンクを確認してください

JVMは、スレッドスタックと呼ばれる各スレッドメモリスペースを割り当てます。デフォルト値は、OSとJVMによって異なります。-Xssオプションを設定してスレッドに割り当てられたメモリを割り当てたり、ヒープメモリ-Xmxオプションに割り当てられたスペースを減らしたりすることができます。この記事でJVMチューニングリンクを確認してください。

于 2011-11-17T08:27:57.827 に答える
0

通常、このエラー メッセージは、システムがスレッドの開始に必要なリソースを使い果たしたことを意味します。通常、これはスタックのメモリです。

Java 1.4.1 は 2002 年 9 月にリリースされました。おそらく、システムをアップグレードする必要があります (おそらく、使用されているハードウェアまたはソフトウェアのバージョン)。

于 2011-11-17T08:24:06.383 に答える
0

まあ、それは言う

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

そのため、十分なメモリがないようです。古いスレッドが強制終了されない可能性があるため、メモリがいっぱいになるまでスレッドがどんどん増えていきますか?

または、Java のメモリ サイズを増やすこともできます。

于 2011-11-17T08:41:16.720 に答える
0
/*
 * 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);           
    }   
}
于 2018-08-06T14:35:27.833 に答える