配置内存泄漏策略

缺省情况下,WebSphere® Application Server 的泄漏检测策略处于关闭状态。可配置泄漏检测、预防和操作策略以适应您的应用程序和环境,以便在可能发生内存泄漏时生成报告和采取措施。泄漏检测、预防和主动修正为面对持续内存不足错误的服务器提供保护和弹性。如果检测到类装入器内存泄漏,那么 WebSphere® Application Server 会在日志中向您发送参考消息通知,并执行 JVM 堆转储以便您可诊断该问题。(可选)您也可以选择通过使用反射和其他方法以使 WebSphere Application Server 缓解和(如果可能)修正内存泄漏。

开始之前

类装入器内存泄漏是 Java™ 平台企业修订版 (Java EE) 应用程序中的一种常见错误。内存泄漏可能因细微应用程序错误或较复杂的用法(例如,第三方库)所导致。如果出现泄漏,那么说明使用了系统资源(例如,因为垃圾回收和 Java 堆而产生的 CPU 时间)。即使所有其他资源可用,系统也可能变得无法响应。除非内置了保护和预警系统,否则系统可能会保持此降级状态并因为内存不足错误而导致最终终止。

注: 可使用内存泄漏检测策略来针对类装入器内存泄漏配置 WebSphere Application Server 以检测、预防和执行操作(如果可能)。有关内存泄漏的更多信息,请阅读“Java 平台企业修订版应用程序”主题中的内存泄漏。

关于此任务

缺省情况下,泄漏检测选项处于禁用状态。您可以使用 Java 虚拟机 (JVM) 定制属性来调整泄漏策略值,例如,启用和禁用泄漏检测、操作和预防。这些定制属性仅适用于独立服务器或受管应用程序服务器,不适用于 Node Agent、管理代理程序、作业管理器或 Deployment Manager。应用程序或服务器关闭时,WebSphere Application Server 会确定已泄漏并具有对所有关联的已装入类和对象的引用的类装入器。如果检测到类装入器泄漏,那么会执行堆转储或系统转储。

此服务的所有持久配置都是使用 JVM 定制属性完成的。没有管理控制台面板。在运行时,分别使用 MemoryLeakConfig mbean 和 MemoryLeakAdmin mbean 进行配置和管理;但是,在配置 JVM 定制属性前不会保存配置更改。

MemoryLeak 服务及其 mbean 仅在主管应用程序和服务请求的应用程序服务器中处于活动状态。此服务在 Deployment Manager、Node Agent、管理代理程序或其他服务器类型(例如,WebSphere 代理服务器等)上处于不活动状态。

提示: 配置 JVM com.ibm.ws.runtime.component.disableMemoryLeakService 定制属性来永久禁用此服务。

过程

  1. 根据下表,创建或修改 JVM 定制属性以启用内存泄漏服务的各个方面。请参阅 Java 虚拟机定制属性以更改 JVM 定制属性的值。
    表 1. com.ibm.ws.runtime.component.MemoryLeakConfig.detectAppCLLeaks
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.detectAppCLLeaks
    描述 服务器关闭或应用程序停止时,WebSphere Application Server 会确定已泄漏的类装入器,并发出警告和其他附加信息来帮助调试内存泄漏。另请参阅已改进的类装入器泄漏检测 PMR。
    缺省值 false
    表 2. com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks
    描述 启用主动类装入器泄漏调解和修正。此属性设置为 true 时,WebSphere Application Server 会代表应用程序进行调解以补救所检测到的任何类装入器泄漏。
    缺省值 false
    表 3. com.ibm.ws.runtime.component.MemoryLeakConfig.preventJreMemoryLeaks
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.preventJreMemoryLeaks
    描述 允许 WebSphere Application Server 消除线程上下文类装入器上的 JRE 装入单项导致的某些内存泄漏类。
    缺省值 true
    表 4. com.ibm.ws.runtime.component.MemoryLeakConfig.generateHeapDumps
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.generateHeapDumps
    描述 设置为 true 以在检测到内存泄漏时创建堆转储。
    缺省值 true
    表 5. com.ibm.ws.runtime.component.MemoryLeakConfig.leakSweeperDelay
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.leakSweeperDelay
    描述 在应用程序或模块停止后延迟以检查类装入器泄漏。
    缺省值 10000(毫秒)
    表 6. com.ibm.ws.runtime.component.MemoryLeakConfig.monitorSystemApps
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.monitorSystemApps
    描述 设置为 true,以观察 IBM® 交付的系统应用程序(例如,管理控制台)上的内存泄漏。
    缺省值 false
    注意: 您可以使用以下线程和计时器泄漏 JVM 定制属性来微调泄漏操作策略行为。仅当 com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks 设置为 true 时,ThreadLocal、线程、计时器和静态泄漏定制属性才适用。
    表 7. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesInterruptThreads. 线程和计时器泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesInterruptThreads
    描述 设置为 true,以使 WebSphere Application Server 尝试中断 Web 应用程序启动的线程。中断线程是通过使用 Thread.interrupt() 方法执行的。可能目标线程无法响应该中断。
    缺省值 true
    表 8. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesHttpClientKeepAliveThread. 线程和计时器泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesHttpClientKeepAliveThread
    描述 如果此 Web 应用程序未启动 HttpClient 保持活动计时器线程并且此线程仍在运行,那么 WebSphere Application Server 会将上下文类装入器从当前类装入器更改为其父代以防止内存泄漏。保持活动线程全部终止时,保持活动计时器线程会自己停止。但是,在繁忙系统上,有一段时间可能不会发生此情况。
    缺省值 true
    表 9. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStopTimerThreads. 线程和计时器泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStopTimerThreads
    描述 设置为 true,以使 WebSphere Application Server 停止该 Web 应用程序启动的所有 java.util.TimerThreads。
    缺省值 false
    表 10. com.ibm.ws.runtime.component.MemoryLeakConfig.jvmThreadGroupNames. 线程和计时器泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.jvmThreadGroupNames
    描述 扫描由必须关闭的 Web 应用程序启动的线程时要忽略的 ThreadGroup 名称列表。此列表由下划线划分。
    缺省值 system__RMI Runtime
    注意: 仅当 com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks 设置为 true 时,以下静态类变量泄漏属性才适用。
    表 11. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStatic. 静态类变量泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStatic
    描述 设置为 true,以使 WebSphere Application Server 尝试在 Web 应用程序停止时使已装入类中的最终字段为空,以作为处理垃圾回收错误和应用程序编码错误的变通方法。如果此选项设置为 false,那么没有内存泄漏且使用最近 JVM 的应用程序应正常运行。
    缺省值 false
    表 12. com.ibm.ws.runtime.component.MemoryLeakConfig.filterPrefixes. 静态类变量泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.filterPrefixes
    描述 如果 clearReferencesStatic 为 true,那么以这些过滤器开头的成员属性未设置为空。
    缺省值 java javax com.ibm org sun com.sun。此列表由空格划分。
    注意: 仅当 com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks 设置为 true 时,以下 Threadlocal 泄漏属性才适用。
    [AIX Solaris HP-UX Linux Windows][IBM i]
    表 13. com.ibm.ws.runtime.component.MemoryLeakConfig.checkThreadLocalLeaks. Threadlocal 泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.checkThreadLocalLeaks
    描述 确定应用程序停止时是否应检查 ThreadLocal 泄漏。
    缺省值 false
    [AIX Solaris HP-UX Linux Windows][IBM i]
    表 14. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesThreadLocal. Threadlocal 泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesThreadLocal
    描述 通过在线程池中更新线程以在应用程序停止时消除 threadlocal 泄漏。此属性仅适用于分布式平台。
    缺省值 true
    注意: 仅当 clearReferencesThreadLocal 设置为 true 时,以下属性才适用。
    [AIX Solaris HP-UX Linux Windows][IBM i]
    表 15. com.ibm.ws.runtime.component.MemoryLeakConfig.renewThreadPoolNames. Threadlocal 泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.renewThreadPoolNames
    描述 检测到 threadlocal 泄漏时 WebSphere Application Server 必须更新的 threadpool 名称。
    缺省值 “WebContainer”列表由空格划分。
    [AIX Solaris HP-UX Linux Windows][IBM i]
    表 16. com.ibm.ws.runtime.component.MemoryLeakConfig.threadPoolRenewalDelayFactor. Threadlocal 泄漏
    信息
    名称 com.ibm.ws.runtime.component.MemoryLeakConfig.threadPoolRenewalDelayFactor
    描述 控制等待更新线程池的总时间量。要等待线程池更新的时间量 = threadPoolRenewalDelayFactor * threadPool.getKeepAliveTime()
    缺省值 10. 对于 Web 容器线程池,更新延迟为 (10 * 60000 ms) 6 分钟。
    [AIX Solaris HP-UX Linux Windows][IBM i]
    表 17. com.ibm.ws.util.ThreadPool.DEFAULT_THREAD_RENEWAL_DELAY. Threadlocal 泄漏
    信息
    名称 com.ibm.ws.util.ThreadPool.DEFAULT_THREAD_RENEWAL_DELAY
    描述 池中的线程在应用程序停止后更新。使用此定制属性以避免同时更新所有线程。此延迟是在要更新的两个线程之间发生的。
    缺省值 1000(以毫秒计的值)。如果值为负数,那么线程永远不更新。
    这些 JVM 定制属性保存在 WebSphere Application Server 配置模型的 server.xml 文件中。以下代码片段显示非受管服务器的 server_home /config/cells/nodes/servers/server.xml 文件中已保存的泄漏策略配置:
    <jvmEntries xmi:id="JavaVirtualMachine_1183122130078" verboseModeClass="true" verboseModeGarbageCollection="true" verboseModeJNI="false" 
    runHProf="false" hprofArguments="" debugMode="false" debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777" 
    genericJvmArguments="-agentlib:getClasses -Xquickstart  -Xalwaysclassgc" executableJarFileName="" disableJIT="false">
    	<systemProperties xmi:id="Property_1317048628648" name="com.ibm.ws.runtime.component.MemoryLeakConfig.detectAppCLLeaks"	value="true"	/>
    	<systemProperties xmi:id="Property_1318975518491" name="com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks"	value="true"	/>
    	<systemProperties xmi:id="Property_1318955284241" name="com.ibm.ws.runtime.component.MemoryLeakConfig.generateSystemDumps"	value="false"	/>
    	<systemProperties xmi:id="Property_1319119976147" name="com.ibm.ws.runtime.component.MemoryLeakConfig.generateHeapDumps"	value="true"	/>
    	<systemProperties xmi:id="Property_1317048628649" name="com.ibm.ws.runtime.component.MemoryLeakConfig.monitorSystemApps"	value="false"	/>
    </jvmEntries>
  2. 单击应用
  3. 单击确定
  4. 保存更改。 请确保在重新启动服务器之前执行文件同步。
  5. 重新启动应用程序服务器以使更改生效。

示例

可按此示例中所述使用 JVM 定制属性来配置和保存 WebSphere Application Server 的内存泄漏策略。可使用 MemoryLeakConfig MBean 在运行时更改内存泄漏检测、预防和策略配置。

可使用 MemoryLeakAdmin mbean 来执行内存泄漏策略的管理。泄漏策略会影响应用程序或服务器停止时应用程序服务器响应类装入器内存泄漏的方式。

可使用 wsadmin 脚本编制接口来调整内存泄漏策略设置。这些更改会立即生效,但不会保存至服务器配置,并且会在服务器重新启动时丢失。以下脚本提供了一个示例,说明如何使用 wsadmin jacl 脚本编制来配置和管理内存泄漏策略:
# Scripting in JACL

# Get the object name of the MemoryLeak Configiration object  you want to change the values on
set leakConfig [$AdminControl completeObjectName "type=MemoryLeakConfig,*"]
WebSphere:cell=smitaNode03Cell,name=LeakConfig,type=MemoryLeakConfig,node=smitaNode03,process=server1

# Get the object name of the MemoryLeak Administration object  you want to issue operations
set leakAdmin [$AdminControl completeObjectName "type=MemoryLeakAdmin,*"]
WebSphere:cell=smitaNode03Cell,name=LeakAdmin,type=MemoryLeakAdmin,node=smitaNode03,process=server1

# Look at all the attributes of the MemoryLeakConfig mbean
wsadmin>$Help all $leakConfig
Name: WebSphere:cell=smitaNode03Cell,name=LeakConfig,type=MemoryLeakConfig,node=smitaNode03,process=server1
        Description: Information on the management interface of the MBean
        Class name: com.ibm.ws.runtime.component.MemoryLeakConfig

Attribute                       Type                            Access
JvmThreadGroupNames             java.lang.String                RW
FilterPrefixes                  java.lang.String                RW
RenewThreadPoolNames            java.lang.String                RW
DetectAppCLLeaks                boolean                         RW
ClearAppCLLeaks                 boolean                         RW
MonitorSystemApps               boolean                         RW
NoDumps                         boolean                         RW
GenerateHeapDumps               boolean                         RW
GenerateSystemDumps             boolean                         RW
ClearReferencesStatic           boolean                         RW
ClearReferencesInterruptThreads   boolean                       RW
ClearReferencesStopTimerThreads   boolean                       RW
ClearReferencesHttpClientKeepAliveThread  boolean               RW
ClearReferencesThreadLocal      boolean                         RW
LeakSweeperDelay                int                             RW
ThreadPoolRenewalDelayFactor    int                             RW
PreventJreMemoryLeaks           boolean                         RW
LeakConfiguration               java.lang.String                RO

Operation
Notifications
Constructors

# Print the current Memory Leak Policy configuration on the console 
wsadmin>$AdminControl getAttribute $leakConfig LeakConfiguration
MemoryLeakConfig [getClass()=class com.ibm.ws.runtime.component.MemoryLeakConfig, hashCode()=37266644
preventJreMemoryLeaks true
detectAppCLLeaks true
         monitorSystemApps false
         leakSweeperDelay 10000
clearAppCLLeaks true
         clearReferencesStopTimerThreads false
         clearReferencesHttpClientKeepAliveThread true
         clearReferencesInterruptThreads true
                  jvmThreadGroupNames [system, RMI Runtime]
         clearReferencesStatic true
                 filterPrefixes [java., javax., com.ibm., org., sun., com.sun]
         clearReferencesThreadLocal true
                  renewThreadPoolNames [WebContainer]
                  threadPoolRenewalDelayFactor 1
noDumps false
         generateHeapDumps true
         generateSystemDumps false

# Change the configuration
wsadmin>$AdminControl setAttribute $leakConfig ThreadPoolRenewalDelayFactor 10
wsadmin>$AdminControl setAttribute $leakConfig ClearReferencesStopTimerThreads true

# See the updated configuration
wsadmin>$AdminControl getAttribute $leakConfig LeakConfiguration
MemoryLeakConfig [getClass()=class com.ibm.ws.runtime.component.MemoryLeakConfig, hashCode()=37266644
preventJreMemoryLeaks true
detectAppCLLeaks true
         monitorSystemApps false
         leakSweeperDelay 10000
clearAppCLLeaks true
         clearReferencesStopTimerThreads true
         clearReferencesHttpClientKeepAliveThread true
         clearReferencesInterruptThreads true
                  jvmThreadGroupNames [system, RMI Runtime]
         clearReferencesStatic true
                 filterPrefixes [java., javax., com.ibm., org., sun., com.sun]
         clearReferencesThreadLocal true
                  renewThreadPoolNames [WebContainer]
                  threadPoolRenewalDelayFactor 10
noDumps false
         generateHeapDumps true
         generateSystemDumps false

# Look at all the operations of the MemoryLeakAdmin mbean
wsadmin>$Help all $leakAdmin
Name: WebSphere:cell=smitaNode03Cell,name=LeakAdmin,type=MemoryLeakAdmin,node=smitaNode03,process=server1
        Description: Information on the management interface of the MBean
        Class name: com.ibm.ws.runtime.component.MemoryLeakAdmin
Operation
java.lang.String findLeaks()
java.lang.String fixLeaks()
java.lang.String fixLeaks(java.lang.String)

# Find current classloader memory leaks
wsadmin>$AdminControl invoke $leakAdmin findLeaks
CWMML0028I: The following web applications were stopped (reloaded, undeployed), 
but their classes from previous runs are still loaded in memory, 
thus causing a memory leak.[[78577.075.724.NWALogging#NWALoggingEJB.jar]].

# Fix ALL current classloader memory leaks
wsadmin>$AdminControl  invoke $leakAdmin fixLeaks
CWMML0036I: Please watch the SystemOut log for results of the fix leak operation.

wsadmin>$AdminControl  invoke $leakAdmin fixLeaks {"78577.075.724.NWALogging#NWALoggingEJB.jar"}
CWMML0036I: Please watch the SystemOut log for results of the fix leak operation.

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=ttrb_configmemleak
文件名:ttrb_configmemleak.html