【问题标题】:unable to create new native thread无法创建新的本机线程
【发布时间】:2014-01-28 11:41:03
【问题描述】:

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

线程“主”java.lang.OutOfMemoryError 中的异常:无法 在 java.lang.Thread.start0(Native Method) 创建新的本地线程 在 java.lang.Thread.start(Thread.java:658) 在 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) 

【问题讨论】:

  • 你打算启动多少个线程?!
  • 哇,你不只是启动一个服务器,你启动了许多个服务器。多少?很难说,但你会一直这样做,直到你的线程用完。

标签: java multithreading out-of-memory


【解决方案1】:

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

【讨论】:

  • 您需要多少台服务器才能监听?我猜只有一个。只需一次启动一个线程,直到你的 byte[] 被填满,然后处理它并结束线程,然后设置另一个来监听。也许您的孩子应该实现 Runnable,然后您可以使用 java.util.concurrent.ThreadPoolExecutor。你为什么不寻找你需要解决的真正问题的解决方案并复制它。通过这种方法可以学到很多东西。
【解决方案2】:

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

【讨论】:

  • 在您的示例代码中,Socket s = serverSocket.accept(); 阻塞,等待连接。所以它不会像您发布的代码那样快速循环。您需要拨打accept() 或类似的电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多