我有一个 Grails Web 应用程序(只是一个标准 war 文件),部署在运行 tomcat 6 的 Ubuntu 10.10 服务器上。我的数据库是 postgresql。
问题是,当我尝试登录此 Web 应用程序时,它时常会冻结(一天一次或两次,在不活动后)。我可以导航到登录页面,但当我尝试登录时(第一次访问数据库,可能是一个线索...?),应用程序会无限期冻结,没有 500 响应代码...浏览器只是等待和等待。
我按照详细的说明这里
因为所描述的问题听起来和我的问题一样。我的 GC 日志显示没有长时间运行的 GC,所有时间都在 10 ...
当应用程序冻结 jmap 堆输出时...
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 536870912 (512.0MB)
NewSize = 21757952 (20.75MB)
MaxNewSize = 87228416 (83.1875MB)
OldSize = 65404928 (62.375MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 19595264 (18.6875MB)
used = 11411976 (10.883308410644531MB)
free = 8183288 (7.804191589355469MB)
58.23843965562291% used
Eden Space:
capacity = 17432576 (16.625MB)
used = 9249296 (8.820816040039062MB)
free = 8183280 (7.8041839599609375MB)
53.05754009046053% used
From Space:
capacity = 2162688 (2.0625MB)
used = 2162680 (2.0624923706054688MB)
free = 8 (7.62939453125E-6MB)
99.99963008996212% used
To Space:
capacity = 2162688 (2.0625MB)
used = 0 (0.0MB)
free = 2162688 (2.0625MB)
0.0% used
concurrent mark-sweep generation:
capacity = 101556224 (96.8515625MB)
used = 83906080 (80.01907348632812MB)
free = 17650144 (16.832489013671875MB)
82.62032270912317% used
Perm Generation:
capacity = 85983232 (82.0MB)
used = 62866832 (59.95448303222656MB)
free = 23116400 (22.045516967773438MB)
73.1152232100324% used
有人知道“来自太空:”是什么吗?
您对进一步查找故障有什么想法吗?我对这种类型的故障查找没有太多经验。
答案1
您的延迟听起来太长了,不可能与 gc 有关。我会在登录页面添加一些检测代码,并测量数据库和页面响应等内容。然后手动或使用 Grinder 等负载测试工具重现该问题。
另外,您是在什么上运行这个程序的?专用硬件还是虚拟机?
呼呼!
汤姆·普尔