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
- 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.detectAppCLLeaksInformació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.clearAppCLLeaksInformació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.preventJreMemoryLeaksInformació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.generateHeapDumpsInformació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.leakSweeperDelayInformació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.monitorSystemAppsInformació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 temporizadorInformació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 temporizadorInformació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 temporizadorInformació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 temporizadorInformació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áticaInformació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áticaInformació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]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
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]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
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]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
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]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
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]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
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>
- Pulse Aplicar.
- Pulse Aceptar.
- Guarde los cambios. Asegúrese de que se lleva a cabo la sincronización de archivos antes de reiniciar los servidores.
- 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.