Forzar el uso de garbage collector

Buen día,

Tengo una aplicación web que es demasiado lenta cuando existen muchos usuarios conectados.

Monitoreo el rendimiento de la aplicación por medio de VisualVM y la misma usa casi el 100% del head

Así que deseo utilizar el garbage collector para poder limpiar la memoria.

Investigando en internet encontré que forzar el garbage collector(GC) es una mala práctica y quisiera saber si existe algún riesgo al forzar el GC.

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Visual VM

Sería mejor idea monitorear qué procesos son pesados/problemáticos y refactorizarlos, o bien ya en otros términos hacer un balanceo de cargas con réplicas de tu aplicación en otro servidor.

Tu no mandas al GC

Es una mala práctica, lo es, pero tú no controlas el GC , el como funciona es que tú le mandas una petición a la JVM para que corra el GC , pero no quiere decir que lo va a hacer cuando tú se lo pidas, puedes usarlo para ganar tiempo mientras encuentran el verdadero problema.

Imagen de skuarch

consumes mas recursos y en

consumes mas recursos y en general es una muy mala práctica, otra recomendación sería checar los objetos que deben cerrarse, que estos se cierren correctamente en un finally (al menos) y también puedes usar jconsole (esta mejor la visusl vm) y cheques que onda

Imagen de SuperSerch

Conjunto de datos vivos

Si la aplicación está lenta puede deberse a un número de cosas; si el heap está al 100% debería morirse tu jvm con un OOME; como menciona Jesús, invocar System.gc() sólo es una sugerencia; y si el heap está arriba de 90% te aseguro que ya se invocó un Full Garbage Collection, así que no te sirve de nada.

en esta platica hablé de como funciona el Garbage Collector https://www.youtube.com/watch?v=eri6yLQ25y8

Imagen de adrianaaae

Mejores practicas

Tal vez sea mejor refactorizar tu codigo; y/o realizar lo que dice skuarch
Es una buena practica; como dicen los comentarios anteriores; el echo de llamar al GC no quiere decir que se ejecute de manera inmediata sino se que pone en la pila de procesos a ejecutar para la JVM; pero ésta solo la ejecuta cuando debe de hacerlo (por que el GC es de baja prioridad).

Recuerda que cuando corre el GC solo recoge y elimina los recursos que no se usan o que no tienen referencias en el Stack.