我有一个多线程爬虫。在这个程序中,如果我加载了很多种子,我就会收到错误。我看到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上运行),但在运行应用程序后,内存不会那么高!我错了吗?
答案 0 :(得分:4)
-Xms512m -Xmx3G 选项仅影响JVM的堆大小,无法解决您的问题。
但是,在大多数情况下,默认的线程数限制应该足够了。您可以通过调整JVM / System选项来增加限制,但无论您创建多少线程,系统的容量都会受到计算机资源的限制。例如cpu,内存,网络等
我建议从不同的角度解决这个问题:
答案 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,请在~/.profile
:ulimit -u 4096
根据您的代码和您使用的操作系统,many reasons可能会出现这种情况。