Pregunta

Por ejemplo I tal código

... conseguir un poco de memoria y perder todos los punteros a la memoria para que System.gc (); puede recogerla.

llamada System.gc ();

hacer algunas otras tareas;


Aquí tiene el "hacer otras tareas;" y "System.gc ();" trabaja en paralelo o es el "hacer otras tareas;" espera a que "System.gc ();" para ser ejecutado

Gracias

¿Fue útil?

Solución

El comportamiento exacto aquí depende totalmente de la aplicación JVM. En las especificaciones (que es lo que una adecuada las necesidades de ejecución de JVM para proporcionar usted), puede ocurrir en paralelo, puede suceder antes de su ejecuta el código, o que no puede suceder en absoluto.

En la práctica, mi observación sobre las JVM que he pasado a observar es que se ejecuta inmediatamente en un hilo separado. Sin embargo, en algunos casos varias llamadas lanzan múltiples hilos, a veces se pone en cola las peticiones en un hilo. La recolección de basura lanzada siempre fue un tipo "stop-el-mundo" (que es que era muy completo y más lento o se detuvo la aplicación).

Sin embargo, dada su comentario a @ Chris Dail, el problema de fondo no es el comportamiento de una llamada System.gc (). Llamando System.gc () puede tener algunos usos. Se puede utilizar la memoria clara para que pueda tener una idea de lo grande que la huella de la aplicación en la práctica es actualmente. También se puede utilizar como una estrategia para asegurar que una recolección de basura stop-el-mundo sucede antes para que se "detiene el mundo" durante un corto período de tiempo, porque hay menos memoria para borrar. (Debo señalar que como get de JVM más y más sofisticados este tipo de cosas es menos necesario, y de hecho se convierte en contraproducente).

Lo que no hace sin embargo, es de ninguna manera a resolver un OutOfMemoryError. La JVM no le dará un OutOfMemoryError hasta que se haya recogido la basura a la medida de sus posibilidades. Llamando System.gc no cambia eso. Si usted tiene un OutOfMemoryError es probable porque tiene en sus manos referencia a objetos de manera que realmente no necesita, pero que impiden que los objetos de memoria de ser recuperada.

Otros consejos

probablemente no debería estar usando System.gc (). Un error común entre los usuarios de C / C ++ que viene a java es que creen que necesitan para contar la máquina virtual cuando se puede llevar a cabo la recolección de basura. La realidad es que el recolector de basura está muy optimizado y lleva a cabo esta tarea por sí mismo cuando se siente que es mejor que lo haga. Generalmente no se recomienda llamar System.gc ().

Si llama System.gc () sin embargo, será 'recomendar' al sistema para llevar a cabo la recolección de basura. Que en realidad no puede realizar una colección, aunque normalmente lo hace. Si se ejecuta en otro hilo depende del algoritmo de colección real. El único defecto bloqueará todo mientras se ejecuta. Por lo que puede funcionar en hilos separados pero bloqueará su ejecución actual cuando lo hace.

Por lo general es síncrona, pero no garantizada.

En realidad ni se garantiza que una colección tendrá efectivamente lugar desde la JVM decidirá si tiene sentido y qué tipo de uso recolección de basura.

Si necesita información adicional que puede poner en marcha su programa con la bandera -verbosegc ..

En cualquier caso, la recolección de basura es algo que ha emitido automáticamente por la JVM, sin escala especificados, invocando System.gc() es sólo un indicio que le das a hacerle saber que se puede iniciar una colección.

Eric Eijkelenboom a cabo en punta, llamar a este método no significa que el del colector de basura se ejecutará inmediatamente. En realidad no se sabe si se va a llamar a todos ...

En su caso (a juzgar por el comentario sobre Amarghosh 's respuesta) que necesita para liberar algo de memoria antes hacer algo que requiere una gran cantidad de memoria RAM Estoy en lo cierto? En ese caso, usted no tiene que preocuparse. Si no hay suficiente memoria para ser basura recogida se hará de forma automática cuando intenta asignarlo.

Como la recogida de basura se ejecuta depende de la JVM-aplicación. implementaciones habituales pueden detener todos los hilos, a la memoria a cobro revertido a nivel mundial, detener sólo un hilo a la memoria a cobro revertido local para este hilo, por ejemplo. Leer más acerca de la recolección de basura de Sun y en este antiguo pero artículo .

"hacer otras tareas" espera a que System.gc() de ejecutar y de retorno.

No hay forma de saberlo. Llamando System.gc() no significa que una recolección de basura se lleva a cabo en ese mismo segundo, que sólo se ha programado. Corresponde a la JVM para llevar a cabo la recolección de basura en un momento suitabe.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc () : " Cuando el control regresa de la llamada al método, la máquina virtual de Java ha hecho un mejor esfuerzo por espacio de recogida de todos los objetos desechados. "

Así que diría que "hacer otras tareas;" espera a que "System.gc ();" para ser ejecutado!

No se paralelismo se utiliza - y eso no es bueno para una aplicación Java. De hecho, nunca es una buena idea para llamar / forzar el recolector de basura. Debe ser reserva para casos extremos, sin otras soluciones ...

adiós, Alban.

De acuerdo con la especificación de Java, el hilo que llama System.gc() se detiene hasta que el GC ha hecho su obra. Tenga en cuenta que esto es sólo una pista, la JVM es libre de hacer caso omiso de ella, y JVM de Sun en realidad tiene un modificador de línea de comandos (-XX:-DisableExplicitGC) a tal efecto. Con este interruptor, System.gc() no hace nada y vuelve inmediatamente.

De cualquier manera, no hay nada en la especificación evita que otros hilos de ejecución. Esto depende del algoritmo de GC; JVM de Sun incluye varios, algunos de los cuales es capaz de ejecutar simultáneamente con los hilos de aplicativos para la mayor parte de su trabajo.

Como fue señalado por otros, el efecto neto de llamar System.gc() es explícitamente, la mayoría de las veces, a disminuir el rendimiento. Si usted siente que debe llamar a ese método, entonces es probable que usted está haciendo algo mal.

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