Foro sobre Java SE > Garbage Collector
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.
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
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
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/
Uso eclipse
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...
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
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.