sirve settitle que para definicion java garbage-collection jvmti

definicion - para que sirve settitle en java



Java: ¿Cómo se fuerza realmente un GC con la colección ForceGargabeCollection de JVMTI? (4)

Como dijo Anon, tenemos algo similar en eclipse para ejecutar el recolector de basura explícitamente.

Por favor, eche un vistazo a Eclipse: Botón recolector de basura

Esto parece funcionar bastante bien. Le sugiero que eche un vistazo al código detrás de este botón "Ejecutar recolector de basura" y reutilícelo.

Algunos miembros dicen que usa System.gc () pero no puedo confirmarlo. Los expertos en eclipse pueden arrojar algo de luz aquí.

No estoy buscando las respuestas habituales de "solo puedes insinuar el GC en Java usando System.gc () ", no es en absoluto de lo que trata esta pregunta.

Mis preguntas no son subjetivas y se basan en una realidad: GC puede ser forzado en Java por un hecho. Muchos de los programas que utilizamos a diario lo hacen: IntelliJ IDEA, NetBeans, VisualVM.

Todos ellos pueden obligar a GC a suceder.

Como se hace

Supongo que todos usan JVMTI y, más específicamente, ForceGarbageCollection (note 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 pregunta no trata sobre "por qué" quisiera hacer esto: el "por qué" puede ser "curiosidad" o "estamos escribiendo un programa similar a VisualVM", etc.

La pregunta realmente es "¿cómo se fuerza un GC con la colección ForceGarbageCollection de JVMTI"?

¿Es necesario lanzar la JVM con algún parámetro especial?

¿Se requiere algún JNI? Si es así, ¿qué código exactamente?

¿Funciona solo en máquinas virtuales de Sun?

Cualquier ejemplo completo y compilable sería bienvenido.


Construí un agente java básico que permitía invocar la función jgmti ForceGarbageCollection :

#include <stdlib.h> #include <stdio.h> #include <jvmti.h> typedef struct { jvmtiEnv *jvmti; } GlobalAgentData; static GlobalAgentData *gdata; JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { printf("load garbager agent/n"); jvmtiEnv *jvmti = NULL; // put a jvmtiEnv instance at jvmti. jint result = jvm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_1); if (result != JNI_OK) { printf("ERROR: Unable to access JVMTI!/n"); } // store jvmti in a global data gdata = (GlobalAgentData*) malloc(sizeof(GlobalAgentData)); gdata->jvmti = jvmti; return JNI_OK; } extern "C" JNIEXPORT void JNICALL Java_Garbager_forceGarbageCollection(JNIEnv *env, jclass thisClass) { printf("force garbage collection/n"); gdata->jvmti->ForceGarbageCollection(); }

Este agente se invoca a través de JNI :

class Garbager { public static void main(String[] args) { Garbager.garbageMemory(); } static void garbageMemory() { forceGarbageCollection(); } private static native void forceGarbageCollection(); }

Para compilar el agente en MacOSX:

clang -shared -undefined dynamic_lookup -o garbager-agent.so -I /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/darwin garbager-agent.cpp

Para lanzar el Garbager :

java -agentpath:garbager-agent.so Garbager

Basado en este tutorial: Sea dueño de su montón: Iterar instancias de clase con JVMTI


Sí, se necesita el código de interfaz JNI para usar la API JVMTI ya que es una API nativa. "nativo" significa que solo puede llamarlo directamente desde el código nativo (understan c o c ++). Entonces, si desea llamar a esta API desde Java, necesita escribir código JNI para interconectarlo.


NetBeans, al menos, usa System.gc (): http://hg.netbeans.org/main/annotate/9779f138a9c9/openide.actions/src/org/openide/actions/GarbageCollectAction.java (esto es para el botón pequeño que muestra el montón actual y le permite iniciar GC). Si sigue ese enlace, verá que ejecutan explícitamente los finalizadores. Si tiene un poco de espacio libre en el disco y quiere investigar el código usted mismo, está disponible a través de Mercurial: hg clone http://hg.netbeans.org/main/

Por lo que puedo decir, el dogma "System.gc () es solo una pista" se origina en la interpretación pedante de las especificaciones JLS y JVM, que permiten implementaciones Java que no tienen un montón de basura recolectada. Eso, y una lectura incompleta del JavaDoc :

Llamar al método gc sugiere que la máquina virtual de Java haga un esfuerzo para reciclar los objetos no utilizados con el fin de hacer que la memoria que ocupan actualmente esté disponible para reutilización rápida. Cuando el control regresa de la llamada al método, la Máquina Virtual de Java ha hecho un mejor esfuerzo para recuperar el espacio de todos los objetos descartados.

Lea la segunda oración: "el mejor esfuerzo para recuperar espacio" es mucho más fuerte que "sugerencia".

Dicho esto, rara vez hay una razón para llamar a System.gc() . Con disculpas a Knuth:

Debemos olvidarnos de la administración de la memoria, digamos que aproximadamente el 97% del tiempo: la recolección de basura explícita es la raíz de todo mal.