Manejo de memoria
En Java, la gestión de la memoria es principalmente manejada por el recolector de basura (garbage collector) del lenguaje. Aquí hay algunos conceptos clave sobre cómo se maneja la memoria en Java:
- Cuando creas un objeto en Java usando la palabra clave new, se asigna memoria para ese objeto en el heap de Java. El programador no tiene que preocuparse por reservar o liberar memoria explícitamente.
- El heap es la región de memoria en la que se almacenan todos los objetos creados en tiempo de ejecución. La JVM (Java Virtual Machine) asigna un espacio de heap específico cuando se inicia y este espacio se puede ajustar utilizando parámetros de línea de comandos.
- El recolector de basura es un proceso en segundo plano que se encarga de liberar la memoria de los objetos que ya no están en uso, es decir, aquellos que no tienen referencias desde ningún otro objeto o desde el programa principal. El recolector de basura identifica estos objetos no utilizados y los elimina automáticamente para liberar memoria.
- En Java, los objetos se manipulan a través de referencias, que son variables que almacenan direcciones de memoria en lugar de los objetos en sí. Cuando una referencia deja de apuntar a un objeto (por ejemplo, asignándola a null o saliendo de su ámbito), el objeto al que apuntaba se convierte en candidato para ser recolectado por el recolector de basura.
- Java proporciona diferentes algoritmos de recolección de basura para adaptarse a diferentes necesidades y situaciones de rendimiento. Algunos de los algoritmos comunes son el recolector de basura de copia, el recolector de basura de marcado y barrido (Mark-Sweep), y el recolector de basura de marcado y compactación (Mark-Compact).
A demas de las casificaciones de las estructuras de datos vistas anteriormente, existe otra, referente al uso de memoria, es decir, en java existen estructuras estáticas y estructuras dinámicas, sus características se describeben a continuación.
- Son estructuras de datos cuyo tamaño se determina en tiempo de compilación y no puede cambiarse durante la ejecución del programa.
- Un ejemplo común de estructura estática en Java es el arreglo. Los arreglos tienen un tamaño fijo que se especifica cuando se declaran y no se puede cambiar después.
- Las estructuras estáticas son eficientes en términos de acceso y pueden ser adecuadas cuando el tamaño de los datos es conocido y constante.
- Son estructuras de datos cuyo tamaño puede cambiar dinámicamente durante la ejecución del programa.
- En Java, las estructuras dinámicas se implementan generalmente utilizando clases de la biblioteca estándar, como ArrayList, LinkedList, HashMap, etc.
- Estas estructuras de datos proporcionan métodos para agregar, eliminar y modificar elementos de manera dinámica, según sea necesario durante la ejecución del programa.
En la primera casificación de las estructura de datos (Figura 1.1) se mencionan las Estructuras no lineales, para las cuales el manejo de memoria dependerá del tipo de estrucuta base usadas en su constrcción, por ejemplo, para un grafo con una matriz de adyacencia (arreglos), sería una estructura estática, en cmabio para un grafo con una lista de adyacencia (listas), seria una estrctura dinámica.