Pregunta

Soy un programador de C ++ actualmente tratando de trabajar en Java. Trabajando en C ++ Tengo un hábito de hacer el seguimiento de las asignaciones de memoria dinámica y el empleo de diversas técnicas como RAII para evitar pérdida de memoria. Java como sabemos proporciona un colector de basura (GC) para cuidar de la memoria leaks.So mientras programando en Java debe uno dejar ir todas las preocupaciones y sanos de memoria del montón y se deja durante GC para hacerse cargo de las pérdidas de memoria o sería mejor tener un enfoque similar al que, si bien los lenguajes de programación y sin GC, tratar de cuidar de la memoria se puede asignar y dejar GC cuidar de los que es posible que se pierda. ¿Cuál debería ser el enfoque? ¿Cuáles son las desventajas de ambos?

¿Fue útil?

Solución

No estoy seguro de lo que quieres decir, tratando de hacerse cargo de la memoria se puede asignar en presencia de un GC, pero voy a tratar de leer un poco la mente.

Básicamente, no debe ser recogido "preocupación" sobre su memoria. Si no se hace referencia objetos más, que serán recogidos. pérdidas de memoria lógicos seguirían siendo posible si se crea una situación en la que se hace referencia a objetos para el resto de su programa (ejemplo: registrar detectores y nunca eliminar el registro de ellos, ejemplo: la implementación de un vector, como la colección que no establece los elementos a null cuando la eliminación de elementos fuera de la final).

Sin embargo, si usted tiene una sólida formación RAII, se le decepcionado al saber que no hay un equivalente directo en Java. La GC es una herramienta de primera clase para hacer frente a la memoria, pero no hay ninguna está garantizado en cuando (o incluso si) se llaman finalizadores. Esto significa que el tratamiento de primera clase aplicados a la memoria es no se aplica a cualquier otro recurso, como por ejemplo:. Ventanas, conexiones de bases de datos, tomas de corriente, archivos, primitivas de sincronización, etc.

Otros consejos

Con Java y .NET (y me imagino, más otros idiomas GC'ed), usted no tiene que preocuparse mucho acerca de la pila de memoria en absoluto. Lo que lo necesidad de preocuparse, es decir los recursos nativos como identificadores de archivos, sockets, primitivas GUI como fuentes y tal. Los que generalmente necesitan estar "dispuesto", que libera los recursos nativos. (A menudo se dispongan en la finalización de todos modos, pero es un poco dudoso que recurrir a eso. Desechar las cosas a sí mismo.)

Con un GC, usted tiene que:

  • Todavía cuidar adecuadamente a liberar recursos de memoria no como identificadores de archivos y conexiones de base de datos.
  • asegúrese de que no se mantienen las referencias a objetos que no necesita más (como mantenerlos en colecciones). Porque si lo hace, usted tiene una pérdida de memoria.

Además de eso, no puede realmente "cuidar de la memoria se puede asignar", y tratando de hacerlo sería una pérdida de tiempo.

Técnicamente no es necesario que preocuparse de la limpieza después de las asignaciones de memoria ya que todos los objetos están correctamente Referencia contados y el GC se hará cargo de todo. En la práctica, un GC hiperactiva tendrá un impacto negativo en el rendimiento. Así, mientras que Java no tiene un operador de delete, que va a hacer bien a los objetos de reutilización tanto como sea posible.

Además de Java no tiene destructores ya que los objetos se habrá creado hasta que el GC llega a ellos ,. Por lo tanto, Java tiene el constructo finally que se debe utilizar para asegurar que todos los recursos no relacionados con la memoria (archivos de tomas de corriente, etc.) se cierran cuando haya terminado con ellos. No se basan en el método finalise a hacer esto para usted.

En Java el GC se encarga de la asignación de memoria y liberar la memoria no utilizada. Esto no significa que se puede prescindir de la alltogether tema.

Los Java GC permite liberar objetos que tienen no se hace referencia desde la raíz. Esto significa que Java todavía puede tener pérdidas de memoria si no está cuidado para eliminar las referencias de los contextos globales como cachés en HashMaps globales, etc.

Si cualquier grupo de objetos que hacen referencia entre si no se hace referencia desde la raíz, el Java GC los liberará. Es decir. no funciona con cuentas de referencia, por lo que no es necesario null todas las referencias a objetos (aunque algunos estilos de codificación no prefieren la limpieza de referencias como Sonn, ya que ya no son necesarios.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top