0

私はマルチスレッドのクローラーを持っています。このプログラムでは、シードを大量にロードするとエラーが発生します。を見てjava.lang.OutOfMemoryError、メモリが足りないのではないかと思いました。crawler.jarこれらの引数を指定してファイルを実行しようとしましたjava -Xms512m -Xmx3G -jar crawler.jarが、これまでのところうまくいきません。

これは、プログラムの StackTrace です。

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:597)
        at com.sleepycat.je.utilint.DaemonThread.runOrPause(DaemonThread.java:99)
        at com.sleepycat.je.dbi.EnvironmentImpl.runOrPauseDaemons(EnvironmentImpl.java:772)
        at com.sleepycat.je.dbi.EnvironmentImpl.envConfigUpdate(EnvironmentImpl.java:717)
        at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:579)
        at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:204)
        at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:230)
        at com.sleepycat.je.Environment.<init>(Environment.java:212)
        at com.sleepycat.je.Environment.<init>(Environment.java:166)
        ...

私が疑ったように、これはメモリに関連していますか?-Xms512m -Xmx3Gを使用してjarファイルを実行しているときに作業を追加しますjava -jarか?

タスク マネージャーを実行しました (私は Windows Server で実行しています) が、アプリを実行した後、メモリはそれほど高くなりません! 私が間違っている?

4

3 に答える 3

4

-Xms512m -Xmx3Gオプションは JVM のヒープ サイズにのみ影響し、問題は解決しません。

ただし、ほとんどのシナリオでは、デフォルトのスレッド数制限で十分です。JVM/システム オプションを微調整することで制限を増やすことができますが、作成するスレッドの数に関係なく、システムの容量はコンピューター リソースに制限されます。例: CPU、メモリ、ネットワークなど。

別の観点からこの問題を解決することをお勧めします。

  • ワーカー スレッド間で環境インスタンスを共有してみてください。
  • システムがビジー状態で、スレッド数の制限に触れない程度に並行レベルを制御してみてください。
于 2013-01-30T05:45:39.757 に答える
2

この種のエラーは、多くの場合、単純なプロファイリングで解決できます。JDK には jvisualvm が同梱されています。

例 C:\Program Files\Java\jdk1.7.0_11\bin\jvisualvm.exe

ヒープ サイズのグラフを確認できます。また、PermGen スペースも確認する価値があります。

これで何も明らかにならない場合は、jar を実行するときに -XX:-HeapDumpOnOutOfMemoryError を追加してから、ヒープ ダンプを Eclipse メモリ アナライザーにロードしてみてください。

于 2013-01-30T05:07:42.867 に答える
1

Java が処理できるよりも多くのスレッドを生成しています。次の JVM パラメータを使用してスタック サイズを縮小してみてください。-Xss128k

そうでない場合は、OS の制限に達している可能性があります。Linux を使用している場合は、次のような行を に追加します~/.profileulimit -u 4096

これが発生する理由は、コードや使用している OS によって異なります。

于 2013-01-30T05:13:16.250 に答える