这些java错误的原因是什么?

时间:2011-11-17 08:18:40

标签: java peoplesoft

any1是否知道这些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 个答案:

答案 0 :(得分:2)

您为可用于线程堆栈的内存创建了太多线程。您可以减少创建的线程数,或者从(慷慨的)默认值中减少其默认堆栈大小。 -XX:ThreadStackSize=128会使其达到128KB。当然,如果你有一个特别深的方法调用,那么堆栈太少你可能会遇到StackOverflowError(嘿)。

由于你必须使用默认堆栈大小来制作大量线程(数千个),我的直觉说你的最佳解决方案是#1。您的应用中不需要数千个线程。

答案 1 :(得分:1)

直接原因是你的JVM内存不足,无法为新线程创建堆栈。

根本原因更难确定:

  • 应用程序可能会不必要地或浪费地创建线程。

  • 应用程序可能在重新部署时泄漏线程。

  • 线程可能在I / O中阻塞(例如读取套接字)并且永远不会回来。

  • 自定义线程池中可能存在导致线程丢失的错误。

  • 新堆栈所需的内存可能被其他东西用完了;例如由堆或内存映射文件或JNI代码的非堆分配。

  • 依此类推......

调整线程堆栈大小是一种可能在短期内起作用的绑定解决方案。但从长远来看,你需要找出实际导致问题的原因。

您应该首先配置JVM以在OOME上创建转储文件,并使用post mortem dump analyzer查看是否有任何线索;例如处于意外状态的大量线程。

答案 2 :(得分:0)

此错误消息通常表示您的系统已用完启动线程所需的资源。通常这是堆栈的内存。

Java 1.4.1于2002年9月发布。也许您的系统需要升级(可能是使用的硬件或软件版本)

答案 3 :(得分:0)

java.lang.OutOfMemoryError可能是由于应用程序的可用内存引起的,也可能是由于应用程序中的内存泄漏引起的。检查相关的帖子link

JVM分配称为线程堆栈的每个线程内存空间。默认值取决于操作系统和JVM。您可以尝试通过设置-Xss选项来分配分配给线程的内存,并尝试减少分配给堆内存-Xmx选项的空间。查看本文以了解JVM调优link

答案 4 :(得分:0)

嗯,它说

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

所以看来你没有足够的内存。可能是老线程没有被杀掉,所以越来越多的内存已经满了?

或者,您可以增加Java的内存大小。

答案 5 :(得分: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);           
    }   
}