No estoy buscando el usual "solo se puede insinuar el GC en Java usando System.gc()" respuestas, de esto no se trata en absoluto de lo que se trata esta pregunta.Java: ¿Cómo fuerza un GC con ForceGargabeCollection de JVMTI?
Mi pregunta no es subjetiva y se basa en una realidad: GC puede forzarse en Java de hecho. Muchos programas que utilizamos diariamente lo hacen: IntelliJ IDEA, NetBeans, VisualVM.
Todos ellos pueden forzar GC para pasar.
¿Cómo se hace?
Supongo que todos están utilizando JVMTI y más específicamente el ForceGarbageCollection (observe la "Fuerza"), pero ¿cómo puedo probarlo por mí mismo?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
También tenga en cuenta que esta cuestión no se trata de "qué" que me gustaría hacer esto: el "por qué" puede ser "curiosidad" o "estamos escribiendo un programa similar al VisualVM", etc.
La pregunta es realmente "¿cómo forzar un GC utilizando ForceGarbageCollection de JVMTI"?
¿La JVM debe iniciarse con algún parámetro especial?
¿Se requiere JNI? Si es así, ¿qué código exactamente?
¿Funciona solo en máquinas virtuales Sun?
Cualquier ejemplo completo y compilable sería muy bienvenido.
Yo no diría que es un dogma basado en una interpretación pedante. La mayoría de las JVM disponibles permiten deshabilitar las llamadas a System.gc(), por lo que no puedes confiar en que hagan nada. Muy a menudo donde tienes una aplicación bien escrita donde el gc funciona bien, presentando una biblioteca donde el desarrollador pensó que podía "asegurarse de que la memoria esté disponible" llamando a System.gc(), apagarla es la mejor manera de obtener respalda tu buen desempeño de gc. – Fredrik
El usuario todavía tiene control sobre eso. Para la VM de hotspot, puede establecer '-XX: + DisableExplicitGC' o no. Por lo tanto, siempre y cuando tenga control sobre las banderas de JVM, 'System.gc()' es bastante confiable. El argumento solo se aplica a los escritores de bibliotecas que no pueden controlar esos indicadores/no pueden suponer en qué máquina virtual se ejecutará. Es un caso general (especificación) contra el uso de hormigón (con todos los parámetros controlados por el usuario). – the8472
Los escritores de aplicaciones generalmente no tienen control de los indicadores de JVM. La excepción es cuando la aplicación está envuelta en un iniciador que evita que el usuario o sysadmin los modifique. Esto no es pedantería. De hecho, la bandera está allí específicamente para proteger a las personas contra las aplicaciones Java/escritores de aplicaciones que hacen cosas estúpidas. –