无法创建新的本机线程

时间:2014-01-28 03:26:43

标签: java multithreading out-of-memory

当我启动我的服务器时,我得到了错误,但服务器仍然正常工作!

  

线程“main”中的异常java.lang.OutOfMemoryError:无法   在java.lang.Thread.start0创建新的本机线程(本机方法)     在java.lang.Thread.start(Thread.java:658)at   Gateway.main(Server.java:21)

public static void main(String args[]) {  
    try {  
        DatagramSocket serverSocket = new DatagramSocket(Integer.parseInt(args[0]));; 
        System.out.println("Waiting for clients");
      while (true) {         

          Child cServer = new Child(serverSocket);  
        cServer.start();  
      }  
    } catch (IOException ex) {  
      System.out.println(ex);  
    }  
  }  
}  

儿童班

public Child(DatagramSocket ssocket) {  
         this.socket = ssocket;  

       }  


       public void run() {  
           while(true)
            {
               byte[] receiveData = new byte[1024];

编辑: 我尝试在这个例子中制作,它在这里工作正常

public static void main(String[] args) throws IOException {
        server = new MyServer();
        server.runServer();
    }

    private void runServer() {        
        int serverPort = 8071;
        try {
            System.out.println("Starting Server");
            serverSocket = new ServerSocket(serverPort); 

            while(true) {
                System.out.println("Waiting for request");
                try {
                    Socket s = serverSocket.accept();
                    System.out.println("Processing request");
                    executorService.submit(new ServiceRequest(s));
                } catch(IOException ioe) {
                    System.out.println("Error accepting connection");
                    ioe.printStackTrace();
                }
            }
        }catch(IOException e) 

2 个答案:

答案 0 :(得分:1)

您正在无限循环中创建新的Child对象,直到消耗掉所有可用内存。

答案 1 :(得分:1)

new Child()cServer.start()会阻止吗?我怀疑你的while (true)是一个快速的无限循环,它会占用你的堆空间。一旦抛出OutofMemoryError(最多几毫秒),应用程序就会完成并且服务器回收所有内存,所以看起来你的服务器仍在工作。