Расписание FullG C с включенным DisableExplicitG C - PullRequest
1 голос
/ 07 января 2020

Таким образом, проблема в том, что я хотел бы отключить явный G C, чтобы убедиться, что никакая библиотека не может "форсировать" FullG C с System.gc(). Но я бы хотел сохранить некоторый контроль над тем, когда произойдет FullG C. Это выполнимо? Я имею в виду, возможно ли форсировать (или настоятельно рекомендовать) FullG C через JMX или некоторые инструменты управления Tomcat? Или, может быть, какая-то командная строка в cron?

Мотивация форсирования FullG C состоит в том, чтобы не допустить этого в середине дня.

Насколько я понимаю, FullG C произойдет случайным образом с опцией -XX:+DisableExplicitGC. Это произойдет, когда Java почувствует необходимость в этом.

Или, может быть, есть какой-то способ предложить Java что-то вроде "не делать FullG C с 7:00 до 16" : 00"

?

1 Ответ

3 голосов
/ 07 января 2020

Полный 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(&timestamp, &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>
...