0

我有一个用 jav 编写的服务器,在启动时运行在 100MB 的 RAM 左右(从查看进程资源管理器中获得的信息)。但是,当客户端连接到它以传输大文件时,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)
4

1 回答 1

2

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

当您收到此错误时,您有多少个线程?

你可以打印

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

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

于 2012-05-03T10:37:47.840 回答