solucion outofmemoryerror example collector java memory garbage-collection jvm out-of-memory

java - outofmemoryerror - ¿Se garantiza que el recolector de basura se ejecute antes de un error de memoria insuficiente?



java.lang.outofmemoryerror java heap space solucion (5)

El colector de garaje generalmente se ejecutará antes de que se lance un OutOfMemoryError. Sin embargo, podría obtener un OOME sin un GC si

  • tratar de crear un objeto muy grande (por ejemplo, más grande que el montón)
  • iniciar un hilo y no hay suficiente memoria virtual o recursos para iniciar el hilo.
  • las versiones anteriores de Java arrojarían este error si alcanzas tu memoria directa máxima.

En caso de que el montón esté lleno, la JVM lanza un OutOfMemoryError . Pero, ¿está seguro de que siempre se lleva a cabo una recolección de basura (completa) antes de que se lance tal excepción?

Esto significaría que la memoria está llena solo con objetos referenciados fuertes (o accesibles por GC Roots) cuando se lanza la excepción.

Edición: Supongamos que Sun JVM - HotSpot está en discusión.


Hay otros factores adicionales a considerar además de lo que las personas ya han respondido, por ejemplo, la política de recolección de basura que está utilizando. Considere la recolección de basura de rendimiento, esto producirá una excepción de falta de memoria si se pasa demasiado tiempo recolectando y no se está liberando suficiente memoria (aunque los cambios recientes podrían haber cambiado las cosas). Habiendo dicho todo esto, no asumiría que la recolección de basura ocurra en ningún momento dentro de la ejecución de una aplicación que estoy escribiendo ...


Los estados de la Especificación de la Máquina Java en la sección 6.3 (énfasis mío):

OutOfMemoryError : la implementación de la máquina virtual Java se ha quedado sin memoria virtual o física, y el administrador de almacenamiento automático no pudo reclamar suficiente memoria para satisfacer una solicitud de creación de objetos.

Así que la JVM da una garantía de que intentará lo que pueda para liberar memoria a través de la recolección de basura antes de lanzar un OOME.


No hay garantía de que la última operación que precede a OutOfMemoryError sea ​​una recolección de basura. Probablemente no, ya que la recolección de basura reduciría la cantidad de memoria utilizada y no la aumentaría.


No se garantiza que se haya realizado una recolección de basura completa , sino que la máquina virtual ha intentado que haya suficiente memoria disponible a través de la recolección de basura. Podría haberlo encontrado en la documentación de la API para la clase OutOfMemoryError :

Se lanza cuando la máquina virtual de Java no puede asignar un objeto porque no tiene memoria y el recolector de basura no puede poner más memoria disponible.

Tenga en cuenta que hay casos en los que el recolector de basura puede decidir que no hay suficiente memoria disponible sin intentar descartar instancias de objetos sin referencia. El ejemplo más obvio es si intenta asignar más memoria de una sola vez (por ejemplo, una matriz de bytes grande) que el tamaño máximo del montón. En este caso, se puede lanzar un OutOfMemoryError sin que el recolector de basura se ejecute en absoluto.