Contatore di eccezioni Java su JVM HotSpot

Mi chiedo se è ansible registrare ogni eccezione che si verifica a livello di JVM senza modificare il codice dell’applicazione? Con tutte le eccezioni intendo l’eccezione catturata e non rilevata … Vorrei analizzare questi log in un secondo momento e raggrupparli per tipo di eccezione (class) e contare semplicemente le eccezioni per tipo. Sto usando HotSpot;)

Forse c’è un modo più intelligente di farlo? Per esempio da qualsiasi profiler gratuito (YourKit ce l’ha ma non è gratuito)? Penso che JRockit abbia un contatore di eccezioni nella console di gestione, ma non vedo nulla di simile per HotSpot.

Credo che ci siano strumenti gratuiti per farlo, ma persino creare il tuo strumento è facile. JVMTI ti aiuterà.

Ecco un semplice agente JVMTI che ho creato per tracciare tutte le eccezioni:

 #include  #include  #include  #include  void JNICALL ExceptionCallback(jvmtiEnv* jvmti, JNIEnv* env, jthread thread, jmethodID method, jlocation location, jobject exception, jmethodID catch_method, jlocation catch_location) { char* class_name; jclass exception_class = (*env)->GetObjectClass(env, exception); (*jvmti)->GetClassSignature(jvmti, exception_class, &class_name, NULL); printf("Exception: %s\n", class_name); } JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* vm, char* options, void* reserved) { jvmtiEnv* jvmti; jvmtiEventCallbacks callbacks; jvmtiCapabilities capabilities; (*vm)->GetEnv(vm, (void**)&jvmti, JVMTI_VERSION_1_0); memset(&capabilities, 0, sizeof(capabilities)); capabilities.can_generate_exception_events = 1; (*jvmti)->AddCapabilities(jvmti, &capabilities); memset(&callbacks, 0, sizeof(callbacks)); callbacks.Exception = ExceptionCallback; (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks)); (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL); return 0; } 

Per usarlo, crea una libreria condivisa (.so) dal codice sorgente specificato ed esegui Java con -agentpath opzione -agentpath :

 java -agentpath:libextrace.so MyApplication 

Questo registrerà tutti i nomi delle classi di eccezioni su stdout. ExceptionCallback riceve anche un thread, un metodo e una posizione in cui si è verificata l’eccezione, quindi è ansible estendere la richiamata per stampare molti più dettagli.