|
如果应用程序服务器的进程自发关闭,或者其 Web 模块停止响应新请求:
1、如果可能,通过在不同的服务器上安装 Web 模块来隔离此问题。
2、您可以使用性能查看器确定哪些资源已达到其最大容量,如 Java 堆内存(表明可能的内存泄漏)和数据库连接。如果特定的资源显出已达到其最大容量,查看应用程序代码以获取可能的原因:
a、如果使用数据库连接并且从不释放,则确保该应用程序代码在 finally{} 块中的任何开放的 Connection 对象上执行 close()。
b、如果使用中的 servlet 引擎线程稳步增加,则查看应用程序同步代码块以了解可能的死锁情况。
c、如果 JVM 堆大小稳步增加,查看应用程序代码以了解可能的内存泄漏,如静态(类级别)集合导致对象从不进行垃圾回收。
3、作为使用性能查看器的替代方法,要检测内存泄漏问题,请在应用程序服务器上启用详细的垃圾回收。此功能把有关可用内存数量和使用中内存数量的详细说明添加到应用程序服务器的 JVM 错误日志文件。要设置详细的垃圾回收:
a、选择服务器 > 应用程序服务器 > server_name > Java 和进程管理 > 进程定义 > Java 虚拟机,并启用详细垃圾回收。
b、停止并重新启动应用程序服务器。
c、定期或者应用程序服务器停止后,浏览日志文件以获得垃圾回收语句。查找以“allocation failure”开始的语句。该字符串表明内存分配需要已触发 JVM 垃圾回收(释放未使用的内存)。分配失败本身是正常的,并不必然表示有问题。分配故障语句后跟显示需要多少字节以及分配多少字节的语句。
如果空闲和使用的内存总数稳定地增加(JVM 保持为自身分配更多内存),或者如果 JVM 无法分配它所需的内存数(用所需字节语句表明),则可能有内存泄漏。
4、如果性能查看器或详细垃圾回收输出指示应用程序服务器的内存不足,则可能存在下列其中一个问题:
a、在应用程序代码中存在必须解决的内存泄漏问题。要指出内存泄漏的原因,在问题应用程序服务器的服务器 > 应用程序服务器 > server_name > 流程定义 > Java 虚拟机窗格中启用 RunHProf 功能:
- 在相同的 JVM 窗格中,设置 HProf Arguments 字段为类似于 depth=20,file=heapdmp.txt 的值。此值显示异常堆栈最多为 20 个级别,并将堆转储输出保存到 app_server_root/bin/heapdmp.txt 文件。
- 保存这些设置。
- 停止并重新启动应用程序服务器。
- 如果可能,则再现该情况,或访问导致应用程序服务器的进程自发停止或其 Web 模块停止响应新请求的资源。然后停止应用程序服务器。如果不能再现该情况或访问该资源,则等待直到问题再次发生,然后停止应用程序服务器。
- 检查保存堆栈存储的文件。例如,检查 app_server_root/bin/heapdmp.txt 文件:
搜索字符串“SITES BEGIN”。这将查找内存中 Java 对象列表的位置,其显示分配给对象的内存数量。
每当有 JVM 内存分配就有 Java 对象列表。有内存实例化的对象类型以及跟踪堆栈标识(转储中它处列出)记录,记录显示进行分配的 Java 方法。
Java 对象列表是按分配的字节数降序排列的。根据泄漏性质,问题类应该显示在该列表的顶部旁,但不总是这样的情况。在列表中查找大量内存或正在实例化的相 同类的频繁实例。对后一种情况,使用跟踪堆栈列中的标识来识别在相同类和方法中重复发生的分配。
检查相关跟踪堆栈中表明的源代码以获得内存泄漏的可能性。
b、需要增加应用程序服务器缺省最大堆大小。
c、在 WebSphere Application Server 产品中有一个缺陷,您必须报告或通过从维护下载安装修订或修订包来改正此缺陷。联系 IBM 支持机构。
5、如果应用程序服务器的进程自发关闭,则查找 Java 线程转储文件。JVM 在产品目录结构中创建文件,其名称类似于 javacore[number].txt。
6、强制应用程序创建线程转储(或 javacore)。这里是强制线程转储的进程,其不同于较早的产品发行版中的进程:
a、使用 wsadmin 命令提示符,获取问题应用程序服务器的句柄:
wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]
b、生成线程转储:
wsadmin>$AdminControl invoke $jvm dumpThreads
c、在 WebSphere Application Server 安装根目录中查找名称类似 javacore.date.time.id.txt 的输出文件。
7、浏览线程转储以获得线索:
a、如果 JVM 在关闭时创建线程转储(线程转储不是手工强制的),则在文件的开始部分可能会有“错误”或“异常信息”字符串。这些字符串指示导致应用程序服务器的进程自发关闭的线程。
b、线程转储包含进程中每个线程的抽点转储,开始于标号为 "Full thread dump" 的部分。
- 查找描述中包含“state:R”的线程。这样的线程是活动的并在强制转储或进程退出时运行。
- 在相同的 Java 应用程序代码源位置中查找多个线程。来自相同位置的多个线程可能表明死锁条件(监视器上多个线程在等待)或无限循环,并帮助表明有问题的应用程序代码。
IBM 支持机构提供了文档和工具,它们可以节省您在收集解决问题时所需信息上花费的时间。在打开问题报告前,请参阅“支持机构”页面:
http://www.ibm.com/software/webservers/appserv/was/support/ |
|