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)
>
答案 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);
}
}