给更多的内存来我的jar文件(Give more memory to my jar file)

2019-10-29 15:12发布

我有一个多线程的履带。 在这个程序中,如果我加载了不少的种子,我得到一个错误。 我看到了java.lang.OutOfMemoryError和想,也许记忆是不够的。 我尝试运行crawler.jar这些参数文件: java -Xms512m -Xmx3G -jar crawler.jar但到目前为止,没有运气。

这是程序的堆栈跟踪:

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服务器上运行),内存也没有这么高得多! 我错了吗?

Answer 1:

-Xms512m -Xmx3G选项只影响JVM的堆大小,不会解决你的问题。

然而,默认的线程数量的限制应该足够在大多数情况下。 您可以增加通过调整JVM /系统选项的限制,但无论你如何创建多线程,系统的容量是有界到您的计算机资源。 例如,CPU,存储器,网络等

我建议从解决不同的看法这个问题:

  • 尝试将工作线程之间共享的环境情况。
  • 尽量控制并发级别中,你的系统繁忙和线程数限制是没有碰过率。


Answer 2:

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

例如:C:\ Program Files文件\的Java \ jdk1.7.0_11 \ BIN \ jvisualvm.exe

您可以看到堆大小的一个图,它也值得检查PermGen的空间。

如果这么想的透露任何,尝试添加-XX:-HeapDumpOnOutOfMemoryError当你运行你的罐子,然后装入堆转储到Eclipse内存分析器。



Answer 3:

您正在产卵比Java更多的线程可以采取。 试着用这个JVM参数缩小堆栈大小: -Xss128k

如果不是它,也许你正在打在操作系统的限制。 如果您使用的是Linux添加这样一行到~/.profileulimit -u 4096

有许多原因 ,为什么这可能取决于你的代码,您使用的操作系统出现。



文章来源: Give more memory to my jar file