Java OutOfMemoryException无法创建新的本机线程

Java OutOfMemoryException无法创建新的本机线程,java,out-of-memory,Java,Out Of Memory,我有一个用jav编写的服务器,在启动时以100MB左右的RAM运行(从查看process explorer获得的信息)。然而,当一个客户端连接到它来传输一个大文件时,RAM的使用量会上升到160MB左右,我得到了下面的错误。我尝试过设置-Xmx128m、-Xmx256m、-Xmx512m、-Xmx1024m,但没有效果。我应该做些什么来防止这种情况发生。只有当客户端试图从服务器获取大文件时,才会发生这种情况 java.lang.OutOfMemoryError: unable to create

我有一个用jav编写的服务器,在启动时以100MB左右的RAM运行(从查看process explorer获得的信息)。然而,当一个客户端连接到它来传输一个大文件时,RAM的使用量会上升到160MB左右,我得到了下面的错误。我尝试过设置-Xmx128m、-Xmx256m、-Xmx512m、-Xmx1024m,但没有效果。我应该做些什么来防止这种情况发生。只有当客户端试图从服务器获取大文件时,才会发生这种情况

java.lang.OutOfMemoryError: unable to create new native thread
java.lang.Thread.start0(Native Method)
java.lang.Thread.start(Unknown Source)
com.sun.jndi.ldap.Connection.<init>(Unknown Source)
com.sun.jndi.ldap.LdapClient.<init>(Unknown Source)
com.sun.jndi.ldap.LdapClient.getInstance(Unknown Source)
com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)
com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)
com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)
com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)
com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)
com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)
javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
javax.naming.InitialContext.init(Unknown Source)
javax.naming.ldap.InitialLdapContext.<init>(Unknown Source)
java.lang.OutOfMemoryError:无法创建新的本机线程
java.lang.Thread.start0(本机方法)
java.lang.Thread.start(未知源)
com.sun.jndi.ldap.Connection。(未知源)
com.sun.jndi.ldap.LdapClient。(未知源)
com.sun.jndi.ldap.LdapClient.getInstance(未知源)
com.sun.jndi.ldap.LdapCtx.connect(未知源)
com.sun.jndi.ldap.LdapCtx.(未知源)
com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(未知源)
com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(未知源)
com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(未知源)
com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(未知源)
javax.naming.spi.NamingManager.getInitialContext(未知源)
javax.naming.InitialContext.getDefaultInitCtx(未知源)
javax.naming.InitialContext.init(未知源)
javax.naming.ldap.InitialLdapContext。(未知源)

问题是您无法创建另一个线程。这通常是因为您无法分配更多的堆栈空间,但在32位操作系统中通常存在操作系统限制,将此限制设置得更低

出现此错误时,您有多少线程

你可以打印

System.out.println("thread.count=" + Thread.getAllStackTraces().size());

顺便说一句:增加堆大小可以减少为新线程创建堆栈空间的可用虚拟内存量。(这只是32位JVM上的一个问题)这似乎不是您的问题,但令人惊讶的是,在这种情况下,要尝试的第一件事是减少堆空间。

可能重复的可能重复在我看来,如果设置了-Xmx1024M,yuo将-Xmx设置在错误的位置,RAM使用量增长超过700M?你能提供更多的统计数据吗,比如文件有多大?服务器上有多少可用的ram(总的和免费的)?您多久申请一次该文件?当你第一次请求文件时,它会失败吗?你能添加显示你如何读取文件的代码吗?可能您正在读取更多的字节,而不是流式传输文件,因为它会将所有字节一起发送。