Configuración de la política de pérdida de memoria

La política de detección de pérdidas para WebSphere® Application Server está desactivada de forma predeterminada. Puede configurar la política de detección, prevención y acción de pérdidas para acomodar las aplicaciones y el entorno para que las pérdidas de memoria potenciales se notifiquen y se actúe sobre ellas. La detección, prevención y corrección proactiva de pérdidas proporciona protección y resistencia para servidores con problemas persistentes de pérdidas de memoria. Cuando se detecta una pérdida de memora de classloader, WebSphere Application Server envía una notificación al usuario en forma de mensajes informativos en el registro y realiza un vuelco principal de JVM para poder investigar el problema. Puede, como alternativa, elegir que WebSphere Application Server atenúe y, si fuera posible, corrija la pérdida de memoria utilizando el reflejo y otra técnicas.

Antes de empezar

Un error habitual en aplicaciones Java™ EE (Java Platform, Enterprise Edition) es una pérdida de memoria de classloader. Una pérdida de memoria puede producir errores sutiles de aplicación o un uso más complejo, como bibliotecas de terceros. Cuando existe una pérdida, se consumen recursos del sistema como, por ejemplo, tiempo de CPU debido a la recogida de basura y el almacenamiento dinámico de Java. Es posible que un sistema no responda aunque el resto de recursos estén disponibles. A menos incorpore un sistema de protección y advertencia temprana, el sistema puede permanecer en este estado degradado y finalmente cerrarse debido a un error de falta de memoria.

Nota: Puede configurar WebSphere Application Server para que detecte, prevenga y ejecute acciones, de ser posible, en pérdidas de memoria utilizando la política de detección de pérdidas de memoria. Para obtener más información sobre las pérdidas de memoria, lea el tema Pérdidas de memoria en aplicaciones Java Platform, Enterprise Edition.

Acerca de esta tarea

La opción de detección de pérdidas está inhabilitada de forma predeterminada. Puede utilizar las propiedades personalizadas de la máquina virtual de Java (JVM) para ajustar los valores de la política de pérdidas como, por ejemplo, habilitar e inhabilitar la detección, acción y prevención de pérdidas. Estas propiedades personalizadas sólo son aplicables a un servidor autónomo o un servidor de aplicaciones gestionadas y no a un agente de nodo, agente administrativo, gestor de trabajos o gestor de despliegue. Cuando se está cerrando la aplicación o el servidor, WebSphere Application Server determina los cargadores de clases que tienen pérdidas y mantiene las referencias a todas las clases y objetos cargados. Si se detecta una pérdida de cargador de clase, se realiza un vuelco del almacenamiento dinámico o un vuelco del sistema.

Todas las configuraciones permanentes de este servicio serán completadas utilizando las propiedades personalizadas de la JVM. No hay ningún panel de la consola administrativa. Durante la ejecución, utilice los mbeans MemoryLeakConfig y MemoryLeakAdmin para la configuración y administración, respectivamente; no obstante, los cambios de configuración no son permanentes hasta que se hayan configurado las propiedades de personalizadas de la JVM.

El servicio MemoryLeak y su mbean sólo están activos en un servidor de aplicaciones que aloje aplicaciones y solicitudes de servicio. Este servicio no está activo en un gestor de despliegue, agente de nodo, agente administrativo u otros tipos de servidores como el servidor proxy de WebSphere, etc.

Consejo: Configure la propiedad personalizada JVM com.ibm.ws.runtime.component.disableMemoryLeakService para inhabilitar permanentemente el servicio.

Procedimiento

  1. Cree o modifique las propiedades personalizadas de la JVM para habilitar varios aspectos del servicio de pérdidas de memoria utilizando la siguiente tabla. Lea Propiedades personalizadas de la JVM (Java Virtual Machine- Máquina virtual Java) para cambiar los valores de las propiedades personalizadas de la JVM.
    Tabla 1. com.ibm.ws.runtime.component.MemoryLeakConfig.detectAppCLLeaks
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.detectAppCLLeaks
    Descripción Cuando el servidor está concluyendo o una aplicación está detenida, WebSphere Application Server determina los cargadores de clases que ha filtrado y emite avisos y otra información adicional que ayuda a la depuración de pérdida de memoria. Consulte también el artículo Improved classloader leak detection PMR.
    Valor predeterminado false
    Tabla 2. com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks
    Descripción Habilitar la mediación y arreglo proactivo de pérdidas de cargador de clases. Cuando esta propiedad se establece en true, WebSphere Application Server media en nombre de la aplicación para solucionar cualquier pérdida de cargador de clases que se detecte.
    Valor predeterminado false
    Tabla 3. com.ibm.ws.runtime.component.MemoryLeakConfig.preventJreMemoryLeaks
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.preventJreMemoryLeaks
    Descripción Habilitar WebSphere Application Server para eliminar determinadas clases de pérdidas de memoria que son provocadas por el JRE al cargar singletons en el cargador de clases de contexto de hebra.
    Valor predeterminado true
    Tabla 4. com.ibm.ws.runtime.component.MemoryLeakConfig.generateHeapDumps
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.generateHeapDumps
    Descripción Se establece en true para provocar un volcado de almacenamiento dinámico que debe crearse cuando se detecta una pérdida de memoria.
    Valor predeterminado true
    Tabla 5. com.ibm.ws.runtime.component.MemoryLeakConfig.leakSweeperDelay
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.leakSweeperDelay
    Descripción Retardo después de que una aplicación o módulo se detenga para comprobar las pérdidas del cargador de clases.
    Valor predeterminado 10000 (milisegundos)
    Tabla 6. com.ibm.ws.runtime.component.MemoryLeakConfig.monitorSystemApps
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.monitorSystemApps
    Descripción Se establece en true para observar las pérdidas de memoria en las aplicaciones del sistema proporcionadas por IBM®, como por ejemplo la consola administrativa.
    Valor predeterminado false
    Atención: Puede ajustar el comportamiento de la política de acción en caso de pérdidas utilizando las siguientes propiedades personalizadas thread y timer de la JVM. Las propiedades personalizadas ThreadLocal, thread, timer y static leak sólo corresponden si com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks está establecido en true.
    Tabla 7. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesInterruptThreads. Pérdidas de hebra y temporizador
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesInterruptThreads
    Descripción Se establece en para que WebSphere Application Server intente interrumpir aquellas hebras iniciadas por la aplicación web. La interrupción de hebras se realiza utilizando el método Thread.interrupt(). Existe la posibilidad de que la hebra de destino no responda a la interrupción.
    Valor predeterminado true
    Tabla 8. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesHttpClientKeepAliveThread. Pérdidas de hebra y temporizador
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesHttpClientKeepAliveThread
    Descripción Si esta aplicación web no ha iniciado una hebra de temporizador de mantener activo HttpClient y todavía está ejecutándose, WebSphere Application Server cambia el cargador de clase de contexto del cargador de clase actual a su padre para impedir una pérdida de memoria. La hebra de temporizador de mantener activo se detiene por sí misma cuando todas las hebras de mantener activa caducan. Sin embargo, en un sistema ocupado esto puede no producirse durante cierto tiempo.
    Valor predeterminado true
    Tabla 9. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStopTimerThreads. Pérdidas de hebra y temporizador
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStopTimerThreads
    Descripción Se establece en true para que WebSphere Application Server detenga cualquier java.util.TimerThreads iniciado por la aplicación web.
    Valor predeterminado false
    Tabla 10. com.ibm.ws.runtime.component.MemoryLeakConfig.jvmThreadGroupNames. Pérdidas de hebra y temporizador
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.jvmThreadGroupNames
    Descripción Lista de nombres de ThreadGroup que se pasarán por alto al explorar en busca de hebras iniciadas por la aplicación web que deban concluirse. Esta lista está delimitada por caracteres de subrayado.
    Valor predeterminado system__RMI Runtime
    Atención: Las siguientes propiedades de pérdida de variables de clase estática se aplican sólo si com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks está establecido en true.
    Tabla 11. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStatic. Pérdidas de variables de clase estática
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesStatic
    Descripción Se establece en true para que WebSphere Application Server intente hacer nulos cualquiera de los campos finales de las clases cargadas cuando se detiene una aplicación web, como arreglo temporal para problemas de recogida de basura y errores de programación de aplicaciones. Las aplicaciones sin pérdidas de memoria utilizando una JVM reciente deben funcionar correctamente cuando esta opción se establece en false.
    Valor predeterminado false
    Tabla 12. com.ibm.ws.runtime.component.MemoryLeakConfig.filterPrefixes. Pérdidas de variables de clase estática
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.filterPrefixes
    Descripción Los atributos de miembro que empiecen con estos filtros no se establecerán en un valor nulo si clearReferencesStatic es true.
    Valor predeterminado java javax com.ibm org sun com.sun. La lista está delimitada por espacios.
    Atención: Las siguientes propiedades de pérdidas Threadlocal se aplican sólo si com.ibm.ws.runtime.component.MemoryLeakConfig.clearAppCLLeaks está establecido en true.
    [AIX Solaris HP-UX Linux Windows][IBM i]
    Tabla 13. com.ibm.ws.runtime.component.MemoryLeakConfig.checkThreadLocalLeaks. Pérdidas de threadlocal
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.checkThreadLocalLeaks
    Descripción Determina si deben comprobarse las pérdidas ThreadLocal al detenerse una aplicación.
    Valor predeterminado false
    [AIX Solaris HP-UX Linux Windows][IBM i]
    Tabla 14. com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesThreadLocal. Pérdidas de threadlocal
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.clearReferencesThreadLocal
    Descripción Eliminar las pérdidas de threadlocal mediante la renovación de hebras en la agrupación de hebras cuando se detenga una aplicación. Esta propiedad se aplica sólo a las plataformas distribuidas.
    Valor predeterminado true
    Atención: Las siguientes propiedades se aplican sólo si clearReferencesThreadLocal está establecido en true.
    [AIX Solaris HP-UX Linux Windows][IBM i]
    Tabla 15. com.ibm.ws.runtime.component.MemoryLeakConfig.renewThreadPoolNames. Pérdidas de threadlocal
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.renewThreadPoolNames
    Descripción Los nombres de agrupaciones de hebras que WebSphere Application Server debe renovar cuando se detecta una pérdida de threadlocal.
    Valor predeterminado La lista "WebContainer" está delineada por espacios.
    [AIX Solaris HP-UX Linux Windows][IBM i]
    Tabla 16. com.ibm.ws.runtime.component.MemoryLeakConfig.threadPoolRenewalDelayFactor. Pérdidas de threadlocal
    Información Value
    Name com.ibm.ws.runtime.component.MemoryLeakConfig.threadPoolRenewalDelayFactor
    Descripción Controlar la cantidad total de tiempo de espera a que se renueven las hebras de la agrupación. La cantidad de tiempo de espera de renovación de la agrupación de hebras = threadPoolRenewalDelayFactor * threadPool.getKeepAliveTime()
    Valor predeterminado 10. Para la agrupación de hebras del contenedor web, el retraso de renovación es de (10 * 60000 ms) 6 minutos.
    [AIX Solaris HP-UX Linux Windows][IBM i]
    Tabla 17. com.ibm.ws.util.ThreadPool.DEFAULT_THREAD_RENEWAL_DELAY. Pérdidas de threadlocal
    Información Value
    Name com.ibm.ws.util.ThreadPool.DEFAULT_THREAD_RENEWAL_DELAY
    Descripción Las hebras de la agrupación se renuevan después de que una aplicación se detiene. Utilice esta propiedad personalizada para evitar la renovación de todas las hebras al mismo tiempo. Este retraso se observa entre dos hebras que se renuevan.
    Valor predeterminado 1000 (valor en ms). Si el valor es negativo, las hebras no se renuevan nunca.
    Estas propiedades personalizadas de la JVM son permanentes en el modelo de configuración de WebSphere Application Server en el archivo server.xml. El fragmento de código siguiente muestra la configuración de política de pérdidas persistente del archivo inicio_servidor/config/cells/nodes/servers/server.xml de un servidor no gestionado:
    <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. Pulse Aplicar.
  3. Pulse Aceptar.
  4. Guarde los cambios. Asegúrese de que se lleva a cabo la sincronización de archivos antes de reiniciar los servidores.
  5. Reinicie el servidor de aplicaciones para que los cambios entren en vigor.

Ejemplo

La política de pérdida de memoria para WebSphere Application Server se puede configurar y persistir utilizando propiedades personalizadas de JVM tal como se describe en este ejemplo. Durante la ejecución, la detección, prevención y configuración de política de pérdida de memoria se pueden modificar mediante el bean gestionado MemoryLeakConfig.

La administración de la política de pérdida de memoria puede llevarse a cabo utilizando el bean gestionado MemoryLeakAdmin. La política de pérdida afecta a cómo el servidor de aplicaciones responde a una pérdida de memoria de cargador de clases cuando una aplicación o el servidor está detenido.

Puede ajustar los valores de la política de pérdida de memoria mediante la interfaz de scripts de wsadmin. Estos cambios se aplican inmediatamente, pero no persisten en la configuración del servidor, y se pierden cuando se reinicia el servidor. El siguiente script proporciona un ejemplo de cómo configurar y administrar la política de pérdida de memoria mediante scripts jacl de wsadmin:
# Scripts en JACL

# Obtener el nombre del objeto de configuración de MemoryLeak en el que desea cambiar los valores
set leakConfig [$AdminControl completeObjectName "type=MemoryLeakConfig,*"]
WebSphere:cell=smitaNode03Cell,name=LeakConfig,type=MemoryLeakConfig,node=smitaNode03,process=server1

# Obtener el nombre del objeto de administración de MemoryLeak en el que desea emitir operaciones
set leakAdmin [$AdminControl completeObjectName "type=MemoryLeakAdmin,*"]
WebSphere:cell=smitaNode03Cell,name=LeakAdmin,type=MemoryLeakAdmin,node=smitaNode03,process=server1

# Buscar todos los atributos del bean gestionado MemoryLeakConfig
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

# Imprimir la configuración actual de la política de pérdida de memoria en la consola
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

# Cambiar la configuración
wsadmin>$AdminControl setAttribute $leakConfig ThreadPoolRenewalDelayFactor 10
wsadmin>$AdminControl setAttribute $leakConfig ClearReferencesStopTimerThreads true

# Ver la configuración actualizada
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

# Buscar todas las operaciones del bean gestionado MemoryLeakAdmin
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)

# Buscar pérdidas de memoria de cargador de clases actuales
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]].

# Arreglar TODAS las pérdidas de memoria de cargador de clases actuales
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.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=ttrb_configmemleak
File name: ttrb_configmemleak.html