用于创建本机线程的OutOfMemoryError

时间:2014-11-10 05:45:36

标签: java multithreading memory jvm spring-integration

我们目前遇到的问题是我们得到如下的OutOfMemoryError

java.lang.OutOfMemoryError:无法创建新的本机线程

这适用于弹簧集成应用程序

当我进行堆转储时,我注意到以下内容" From Space"在服务器刚启动后检查时几乎总是99%已满。服务器启动后,所有以下统计信息都会立即生效。

Attaching to process ID 24167, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.2-b06

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1887436800 (1800.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 536870912 (512.0MB)
   MaxPermSize      = 1073741824 (1024.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 488112128 (465.5MB)
   used     = 294023920 (280.40306091308594MB)
   free     = 194088208 (185.09693908691406MB)
   60.23696260216669% used
From Space:
   capacity = 44695552 (42.625MB)
   used     = 44676144 (42.60649108886719MB)
   free     = 19408 (0.0185089111328125MB)
   99.95657733458577% used
To Space:
   capacity = 70516736 (67.25MB)
   used     = 0 (0.0MB)
   free     = 70516736 (67.25MB)
   0.0% used
PS Old Generation
   capacity = 715849728 (682.6875MB)
   used     = 16172256 (15.423065185546875MB)
   free     = 699677472 (667.2644348144531MB)
   2.2591691199189783% used
PS Perm Generation
   capacity = 536870912 (512.0MB)
   used     = 74156104 (70.72077178955078MB)
   free     = 462714808 (441.2792282104492MB)
   13.812650740146637% used

我认为这是尝试创建本机线程时出现内存不足错误的最可能原因。

此外,当我通过" top"检查过程使用的内存时命令它永远不是100%,大约是30%到40%。

任何建议

此致 弥兰陀

3 个答案:

答案 0 :(得分:2)

这是一个非常烦人的JVM怪癖,因为措辞" OutOfMemoryError"困扰人们(他们认为那里没有足够的堆等)。实际上,这个错误只是意味着:"无法创建新的本机线程"。

它无法改变的原因,但如果遇到这个问题,正确的解决办法就是找出为什么有这么多线程并限制它们的数量。即使您设法通过调整创建更多线程,您的app.s性能也会受到如此多线程的影响。

您可以使用调试器查看有多少线程处于活动状态。它们可能具有描述性名称,您可以看到它们正在执行的代码。您还可以找出创建它们的线程。一旦找到线程的创建位置,修复它就不会创建这么多线程。

答案 1 :(得分:0)

每个线程都需要堆栈空间,由-Xss设置。奇怪的是,我的

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -XX:+LogVMOutput | grep tack

为intx ThreadStackSize赋予0,但如果指定-Xss2M则为2048。无论如何,默认值可能是64k,并且所有线程的所有堆栈都必须符合您的最大进程大小,对于Win32中的32位进程,该大小限制为1.5GB。

答案 2 :(得分:0)

这个问题有点过时但如果你因为这样的问题来到这里,这里有一点提示来检查Linux系统的限制。在Linux中,主要有两个限制来源:1。ulimit 2. systemd。 第一个是在网络中有详细记录,有进程限制和文件限制。第二个是2016年以来的新版本,systemd定义了DefaultTasksMax限制。这可能会影响多线程Java应用程序和服务。在/etc/systemd/system.conf中,可以在系统范围内配置DefaultTasksMax。但是,建议在启动Java的systemd服务upstart文件中调整TasksMax设置。