Mostrando entradas con la etiqueta programar. Mostrar todas las entradas
Mostrando entradas con la etiqueta programar. Mostrar todas las entradas

jueves, 6 de junio de 2013

Java, monitorización de memoria, herramientas utiles VisualVM

Una herramienta que me ha servido en muchos casos para poder ver el consumo de memoria que esta jhaciendo uso un programa Java es VisualVM






Como se puede ver en las imagenes, podemos hacer un profile de las aplicaciones que tenemos ejecutandose con Java, incluso si tenemos instalado un IDE como eclipse, podemos ejecutar nuestros programas haciendo uso de la JVM Visual, para poder ver el consumo que realizan nuestros programas, es realmente util..

lunes, 27 de mayo de 2013

Java, obtener la extensión de un fichero



Obtener extensión de fichero, en muchos casos en interesante obtener la extensión de un fichero con el que estamos trabajando en Java, para lo que vamos a proponer dos aproximaciones, la primera es la más habitual, consiste en obtener la extensión en base al nombre del  fichero,  o de la ruta completa, devolviendo un texto vacio si no se encuentra el punto que separa la extensión.

      public static String getExtension(String filename) {
            int index = filename.lastIndexOf('.');
            if (index == -1) {
                  return "";
            } else {
                  return filename.substring(index + 1);
            }
}

Ahora una segunda opción, en la que presentamos como hacer esta búsqueda, pero evitando que ocurran errores de retorno, porque se envíen directorios en vez  de ficheros completos, por ejemplo si enviásemos c:\\hola.hola\\ y eso es el nombre de una carpeta, el primer método nos devolvería el hola, como si fuera la extensión del fichero, el segundo detectaría que no es un fichero, sino un directorio, y nos devolvería dentro del primer if. Podríamos ampliar el control, a un segundo if, que pregunte, si lo que nos han enviado es un fichero y si no es ni un directorio, ni un fichero, que se supone que han enviado a la consulta.

      public static String getExtensionFile(String filename) {
            File f = new File(filename);
            if (f == null || f.isDirectory()){
                  return "nulo o directorio";
            }else if (f.isFile()){
                  int index = filename.lastIndexOf('.');
                  if (index == -1) {
                        return "";
                  } else {
                        return filename.substring(index + 1);
                  }
            }else{
                  return "que has enviado?";
            }
      }    

Antes de que a alguien le reviente la vena al ver el método, se que este método es optimizable, soy consciente, pero se trata de no darlo todo hecho, sino las ideas. Está desordenado, mejóralo y úsalo.

domingo, 19 de mayo de 2013

Java, Obtener la memoria que se está usando por la JVM en tiempo de ejecución.




Util cuanto menos, cuando queremos conocer cómo vamos de uso de memoria en alguna prueba, que estemos realizando, con estas sencillas llamadas, podemos conocer qué cantidad de bytes estamos utilizando de memoria en la maquina virtual de Java. Con esto podemos ir viendo en cada momento la cantidad de recursos que tenemos bloqueados por nuestro código, si lo ejecutamos de forma aislada y vamos viendo las diferencias que se generan al ir ejecutando diferentes métodos que tengamos implementados.

También puede sacarte de alguna duda, cuando no tengas claro si en algún punto, el objeto X, se está instanciando de nuevo o solo te traes la referencia del objeto.

Runtime rt = Runtime.getRuntime();
System.out.println(" Memoria libre: " + rt.freeMemory());
System.out.println(" Memoria total: " + rt.totalMemory());
System.out.println(" Memoria uso INICIO: " + (rt.totalMemory() - rt.freeMemory()));



viernes, 17 de mayo de 2013

Java buenas prácticas Instanciar objetos al mínimo.



Una de las operaciones que más coste tienen a la hora de consumir memoria en los desarrollos Java, son las instanciaciones de objetos, estas deben realizarse solo en los casos que sea necesario, evitando de esta manera consumir memoria que no es necesaria. Para ello, existen técnicas que evitan la instanciación de objetos que no sean necesarios.


Vamos a ver ejemplos para los casos de objetos de tipo String, Boolean o Integer. Aunque los casos que más memoria consumen son los objetos personalizados, que estarán formados por más de un atributo de estos tipos, o listas y mapas de variables, pero de esta forma, podemos evitar algunos de esos casos  si lo extrapolamos a nuestros objetos.

Deben evitarse instanciaciones de objetos de tipo String como la siguiente: String a = new String(“Hola”), para lo que podemos usar String a = “Hola” evitando la llamada a new, que consume espacio en memoria, o también String.valueOf(“Hola”).

Para las Boolean, además de la factoría estática (Boolean.valueOf(true)), tenemos la posibilidad, de indicar el valor de la siguiente manera Boolean b = Boolean.TRUE, que tampoco realizaría una instanciación de Boolean.

Citando a los propios creadores de la clase Boolean:

“It is rarely appropriate to use this constructor. Unless a new instance is required, the static factory valueOf(boolean) is generally a better choice. It is likely to yield significantly better space and time performance.”

Solo hay un caso en el que crear una instancia nueva de un Boolean, tiene sentido, y es cuando se quiera hacer una comparación por referencia y no por el valor.

Para los objetos de tipo Integer, tenemos disponible al misma factoría estática, que podemos usar, Integer.valueOf(1), que nos evita la llamada al new de Integer.

jueves, 2 de mayo de 2013

Como acceder a una base de datos Access desde Java.


Una entrada muy rápida de como se conecta la base una base de datos Access a un programa Java.



Para este caso, notificar que Access normalmente el acceso es con USER y PASS en blanco, algo asi: conexion = DriverManager.getConnection("jdbc:odbc:" + NOMBDD, "","");
Comentar además que para que una base de datos, este visible para el driver, debe estar incluida en el origen de datos de Windows, que se encuentra en inicio --> Ejecutar --> ODBCAD32. En la ventana que salta, le damos a añadir (add) elegimos Driver Do Microsoft Access (*.mdb) y introducimos los datos de la base de datos y le damos un nombre, el que usaremos en el código Java

public void abrirConexion() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conexion = DriverManager.getConnection("jdbc:odbc:" + NOMBDD, "USER","PASS");
System.out.println("Conexión");
statment = conexion.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
System.out.println("Conexion exitosa");
} catch (Exception e) {
System.out.println("No se ha podido cargar el Driver JDBC-ODBC");
e.printStackTrace();
}
}
 
public void cerrarConexion() {
try {
statment.close();
conexion.close();
} catch (SQLException e) {
e.printStackTrace();
System.exit(1);
}
}