Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Garbage Collector

Hola,

Estoy desarrollando un programa que tiene que devolver unas matrices.Esto origina realizar muchos cálculos consecutivos y hace que la ram se vaya 'cargando' en cada cálculo. El programa va subiendo la ram hasta que la bloquea y se queda colgado el programa. He intentado usar la llamada al garbage collector (System.gc() ) , pero Java no permite gestionarlo, simplemente te permite que le 'recuerdes' que quieres limpiar el garbage collector, pero él decide cuando.

Agradecería cualquier experiencia en el uso 'determista' (no semi aleatorio) del garbage collector.

Gracias,
saludos.

marzo 7, 2012 | Unregistered CommenterFer00000

Me da la impresión, por lo que explicas, que tu problema está relacionado con algún "memory leak", o con un uso excesivo de variables o instancias con referencias fijas.
Si es el caso, como sospecho, usar System.gc() no resolverá el problema, de la misma manera que tampoco el garbage collector lo consigue: no se puede recuperar memoria que todavía está "en uso", o que el sistema cree que lo está.

En estos casos, y sin ver el código, poco más se puede recomendar. Sin embargo, yo empezaría por revisar la estructura del programa.

marzo 7, 2012 | Registered Commenterchoces

Son 4 for anidados.Lo importante es la función f_correlation_Second_order (la he probado tanto instanciando la clase como de forma estática f_correlation_Second_order_static. Estática funciona algo mejor). La función en si son 4 divisiones. El problema está en que cualquier detalle que se quede como memory leak al ser tantas repiticiones (estoy lanzando ficheros de orden 100 por ahora) va haciendo que suba la ram poco a poco hasta bloquearse.


""""""""""""""""""""""""""""""""" CODIGO PRINCIPAL"""""""""""""""""""""""""""""""""""""""""
for ( GenI = 0; GenI < listGens.length; GenI++) {
System.gc();
taskMonitor.setPercentCompleted((GenI*100)/(listGens.length-1));
for ( GenJ = GenI +1; GenJ < listGens.length; GenJ++) {
value_min=0.0;
for ( GenH = 0; GenH< listGens.length; GenH++) {
if ((GenH != GenI) && (GenH != GenJ)){
for ( GenK = GenH +1; GenK < listGens.length; GenK++) {
if ((GenK != GenI) && (GenK != GenJ) && (GenK != GenH)){
//Versión vieja con llamada en forma de objeto.
//Correlation_Plugin_Model corr_model = new Correlation_Plugin_Model();
//value=corr_model.f_correlation_Second_order(Correlation_Plugin_Comun.hashtable_1_order, GenI, GenJ, GenH,GenK);

value=Correlation_Plugin_Model.f_correlation_Second_order_static(Correlation_Plugin_Comun.hashtable_1_order, GenI, GenJ, GenH,GenK);

if (Math.abs(value)< Math.abs(value_min)){
value = Math.abs(value_min) }
if (value >0) {
Correlation_Plugin_Comun.object_matrix[2].add(GenI,GenJ,value);
}
}}}}
catch....
}catch (Exception ex) {
Correlation_Plugin_Comun.MessageLog("Exception: " + ex.getMessage() +"-" +ex.toString());
}

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


""""""""""""""""""""""""" Funcion f_correlation_Second_order_satic""""""""""""""""""""""
public static double f_correlation_Second_order_static(
Hashtable<String, Double> hst_order1, int genX, int genY, int genZ,
int genQ) {
try {
double value = 0.0;

double value_xyz = 0.0;
double value_xqz = 0.0;
double value_yqz = 0.0;

String str_key_xyz = Correlation_Plugin_Comun.formatter_int_gen
.format(genX)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genY)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genZ);
String str_key_xqz = Correlation_Plugin_Comun.formatter_int_gen
.format(genX)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genQ)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genZ);
String str_key_yqz = Correlation_Plugin_Comun.formatter_int_gen
.format(genY)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genQ)
+ "|"
+ Correlation_Plugin_Comun.formatter_int_gen.format(genZ);


value_xyz = (Double) hst_order1.get(str_key_xyz);
value_xqz = (Double) hst_order1.get(str_key_xqz);
value_yqz = (Double) hst_order1.get(str_key_yqz);

double denominador = Math.sqrt((1 - Math.pow(value_xqz, 2))
* (1 - Math.pow(value_yqz, 2)));
double numerador = value_xyz - (value_xqz * value_yqz);

if ((denominador == 0.0) || (numerador == 0.0)) {
value = 0.0;
} else {
value = numerador / denominador;
}
return Math.abs(value);

} catch (Exception e) {
Correlation_Plugin_Comun.Exception(e);
return 0.0;
} finally {
try {
Correlation_Plugin_Comun.MessageLog("XXXX FINALIZE");
// this.finalize();

} catch (Exception ex) {
// TODO: handle exception
Correlation_Plugin_Comun.MessageLog("Exception: "
+ ex.getMessage() + "-" + ex.toString());
}

}
}

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


Gracias

marzo 8, 2012 | Unregistered Commenterfer00000

Otro tema que estoy mirando si no se pudiera 'atacat' por memory leaks es parametrizando la JVM. De momento lo tengo asi:


-Xms10M
-Xmx768m
-Xss10m
-Dswing.aatext=true
-Dawt.useSystemAAFontSettings=lcd

marzo 8, 2012 | Unregistered Commenterfer00000

No sé con qué estás desarrollando, pero creo que vas a necesitar un profiler, para ver dónde y quién está consumiendo la memoria.

Tal vez te sea útil el VisualVM, si tu IDE no tiene alguno, o no te interesa usarlo.

http://visualvm.java.net/

marzo 8, 2012 | Registered Commenterchoces

Uso eclipse

marzo 8, 2012 | Unregistered Commenterfer00000

No conozco bien Eclipse (más bien casi nada), pero supongo que tendrá algún plugin para profiling. Siempre puedes usar el VisualVM en todo caso.
En estos casos, es necesario ejecutar la aplicación dentro de un profiler, porque con tanto loop anidado...

marzo 8, 2012 | Registered Commenterchoces

Hola.

No esta el código de la clase en concreto, pero dentro del bucle escribes:

Correlation_Plugin_Comun.object_matrix[2].add(GenI,GenJ,value);

Ese add parece de una lista o set. ¿No sera esto lo que se te va llenando?

Salut,
Paposo

marzo 9, 2012 | Unregistered CommenterPaposo