为我的jar文件提供更多内存

时间:2013-01-30 04:57:15

标签: java multithreading web-crawler

我有一个多线程爬虫。在这个程序中,如果我加载了很多种子,我就会收到错误。我看到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上运行),但在运行应用程序后,内存不会那么高!我错了吗?

3 个答案:

答案 0 :(得分:4)

-Xms512m -Xmx3G 选项仅影响JVM的堆大小,无法解决您的问题。

但是,在大多数情况下,默认的线程数限制应该足够了。您可以通过调整JVM / System选项来增加限制,但无论您创建多少线程,系统的容量都会受到计算机资源的限制。例如cpu,内存,网络等

我建议从不同的角度解决这个问题:

  • 尝试在工作线程之间共享Environment实例。
  • 尝试将并发级别控制为系统繁忙且未触及线程数限制的速率。

答案 1 :(得分:2)

这些错误通常可以通过一些简单的分析来解决。 JDK附带jvisualvm。

E.g。 C:\ Program Files \ Java \ jdk1.7.0_11 \ bin \ jvisualvm.exe

您将能够看到堆大小的图表,并且还值得检查PermGen空间。

如果这没有显示任何内容,请尝试在运行jar时添加-XX:-HeapDumpOnOutOfMemoryError,然后将堆转储加载到Eclipse Memory Analyzer中。

答案 2 :(得分:1)

您正在产生比Java更多的线程。尝试使用此JVM参数缩小堆栈大小:-Xss128k

如果不是这样,也许你正在达到操作系统限制。如果您使用Linux,请在~/.profileulimit -u 4096

中添加这样的行

根据您的代码和您使用的操作系统,many reasons可能会出现这种情况。