Problem
WebSphere应用程序服务器线程池可能会在线程销毁时泄露ThreadLocal对象(java.lang.ThreadLocal)。ThreadLocal对象可以占有一个很大的本机内存组件,所以如果存在ThreadLocal对象泄露,您有可能会遇到本机内存泄露问题。
Symptom
应用服务器进程占用的内存会显著增大。您还有可能遇到以下症状:
抛出内存溢出错误(OutOfMemoryError)
在SystemOut.log文件里看见Malloc错误:
JVMDBG001: malloc failed to allocate (malloc分配失败)
创建线程的错误:
“Failed to fork OS thread” (无法分开操作系统线程)
或者
“cannot create anymore threads” (创建线程的错误”无法创建更多线程)
Cause
WebSphere应用程序服务器线程池可能会在线程销毁时泄露ThreadLocal对象。ThreadLocal对象是Java堆对象,但它们拥有一个本机内存组件不会被立即释放,直到ThreadLocal对象被垃圾回收。由于不是每次销毁线程时都垃圾回收它们的ThreadLocal对象,最终会导致本机组件泄露。
Environment
WebSphere应用程序服务器 6.0.2,6.1,及7.0
Diagnosing The Problem
检查javacore文件里线程号比较大的Web容器线程,或者默认的线程池线程,任何线程号超过300的线程都有可能是潜在的泄露线程。如:
"WebContainer : 1003" (TID:0x37D62000
"Default : 338" (TID:109934D0
"TCPChannel.DCS : 303" (TID:0x4D720000
线程名称后面的数字就是线程号,也是线程池创建的线程的数量。
所以,以上例子说明线程池创建了1004个Web容器线程(线程号从0开始)。这并不表示线程池里仍有这么多活跃的线程,因为大它们大部分已经被销毁。线程号不会被重用。
Resolving The Problem
使用固定大小的线程池,会防止线程池收缩,这样会防止线程被销毁。如果没有线程被销毁,就没有遗留的ThreadLocal对象,就不会发生本机内存泄露。
要设置固定大小线程池,请设置相等的线程池最大线程数和最小线程数。这样只要线程池创建的线程数达到最大值,线程池就不会收缩了。线程池最大线程数是线程的阈值,请保持原来的最大线程数。改变最大线程数会对应用程序的性能产生影响。
哪个线程池发生线程泄漏问题,您就需要在管理控制台上改变那个线程池的大小。最常用的两个线程池是Web容器线程池和默认线程池,它们各自的操作指南请参考以下。TCP通道DCS线程池也是一个可能发生线程泄漏的线程池,但它不是常用的线程池。
IBM技术支持会建议您哪个线程池需要设置固定大小。如果您不确定哪一个线程池需要设置,您最好把默认线程池和Web容器两个线程池都设成固定大小。
Web容器线程池:
1. 在管理控制台上,点击服务器 > 应用程序服务器 > 服务器名称。
2. 在页面底部,展开其他属性,点击线程池。
3. 点击“WebContainer”。
4. 更改“最小大小”输入框里的值与“最大大小”相同,如50。
5. 确保“允许线程分配超过最大线程大小”单选框不被选中。
6. 点击“确定”按钮,保存到主配置。
需要重启应用程序服务器使更改生效。
默认线程池
1. 在管理控制台上,点击服务器 > 应用程序服务器 > 服务器名称。
2. 在页面底部,展开其他属性,点击线程池。
3. 点击“Default”。
4. 更改“最小大小”输入框里的值与“最大大小”相同,如50。
5. 确保“允许线程分配超过最大线程大小”单选框不被选中。
6. 点击“确定”按钮,保存到主配置。
需要重启应用程序服务器使更改生效。
Related Information
[{"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Product":{"code":"SSEQTP","label":"WebSphere Application Server"},"Component":"Out of Memory","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"All Versions","Edition":"","Line of Business":{"code":"LOB36","label":"IBM Automation"}}]