0

起動時に100MB程度のRAMで実行されているjavで記述されたサーバーがあります(プロセスエクスプローラーの表示から取得した情報)。しかし、クライアントが大きなファイルを転送するためにそれに接続すると、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ビットOSにはOSの制限があり、この制限を低く設定していることがよくあります。

このエラーが発生した場合、スレッドはいくつありますか?

印刷できます

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

ところで:ヒープサイズを増やすと、新しいスレッド用のスタックスペースを作成するために解放される仮想メモリの量を減らすことができます。(これは32ビットJVMでのみ問題になります)これは問題ではないようですが、この場合、最初に試行するのはヒープスペースを減らすことです。

于 2012-05-03T10:37:47.840 に答える