Полный G C можно принудительно вызвать даже с -XX:+DisableExplicitGC
, вызвав операцию проверки кучи, например GC.class_histogram
Через JMX
MBean: com.sun.management:type=DiagnosticCommand
Operation: gcClassHistogram
Из командной строки
jcmd <pid> GC.class_histogram
Patching System.g c
Кроме того, вы можете перехватить System.gc()
вызовы, предварительно загрузив совместно используемую библиотеку с пользовательской реализацией JVM_GC
.
Вот пример:
#define _GNU_SOURCE
#include <time.h>
#include <dlfcn.h>
void JVM_GC() {
time_t timestamp = time(NULL);
struct tm t;
localtime_r(×tamp, &t);
// Don't do Full GC between 7:00 and 16:00
if (t.tm_hour >= 7 && t.tm_hour < 16) {
return;
}
void* original_jvm_gc = dlsym(RTLD_NEXT, "JVM_GC");
if (original_jvm_gc != NULL) {
((void (*)()) original_jvm_gc)();
}
}
Компиляция:
gcc -O2 -fPIC -shared -o librestrictgc.so restrictgc.c -ldl
Запуск:
LD_PRELOAD=/path/to/librestrictgc.so java <args>