我在 tomcat 容器中运行 Java 应用程序。线程转储显示大多数线程处于 BLOCKED 状态。当我看到堆使用时,我得到以下输出:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 652214272 (622.0MB)
used = 652214264 (621.9999923706055MB)
free = 8 (7.62939453125E-6MB)
99.99999877340925% used
From Space:
capacity = 31981568 (30.5MB)
used = 0 (0.0MB)
free = 31981568 (30.5MB)
0.0% used
To Space:
capacity = 31981568 (30.5MB)
used = 0 (0.0MB)
free = 31981568 (30.5MB)
0.0% used
PS Old Generation
capacity = 1431830528 (1365.5MB)
used = 1281314952 (1221.957160949707MB)
free = 150515576 (143.54283905029297MB)
89.48789168434325% used
PS Perm Generation
capacity = 71303168 (68.0MB)
used = 71127952 (67.83290100097656MB)
free = 175216 (0.1670989990234375MB)
99.75426617790671% used
27815 interned Strings occupying 4203968 bytes.
谁能帮我调试一下。配置有问题吗?
编辑:
CPU 使用率:
Cpu(s): 97.7%us, 1.0%sy, 0.0%ni, 1.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3840320k total, 3741664k used, 98656k free, 103276k buffers
Swap: 4194300k total, 160692k used, 4033608k free, 783984k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23112 root 20 0 3562m 2.4g 8040 S 195 65.2 397:25.18 java
最佳答案
你所有的内存都被使用了,所以可能那里发生了什么。您需要一个堆转储并使用像 Eclipse MemoryAnalizer 这样的工具来查看是否存在内存泄漏。也许应用程序只是在颠簸,线程正在阻塞等待 IO。听起来很有可能。
但可能还有其他问题。该应用程序是否使用数据库、消息队列、FTP 站点、REST 服务等?单独的 JVM 不会像那样发疯和爆炸,这是你试图做的事情导致的。
关于java - CPU 使用率高,几乎所有线程都处于阻塞状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22494484/