我们目前遇到的问题是我们得到如下的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%。
任何建议
此致 弥兰陀
答案 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设置。