在启用 DisableExplicitGC 的情况下安排 FullGC

Schedule FullGC with DisableExplicitGC enabled

所以问题是我想禁用显式 GC 以确保没有库可以 "force" FullGC with System.gc()。但我仍然希望保留对 FullGC 何时发生的一些控制权。这可行吗?我的意思是是否可以通过 JMX 或某些 Tomcat 管理工具强制(或强烈建议)FullGC?或者 cron 中的一些命令行?

强制 FullGC 的动机是确保它不会在一天中发生。

据我了解,FullGC 会随机发生 -XX:+DisableExplicitGC 选项。当 Java 觉得有必要这样做时,它就会发生。

或者也许有一些方法可以建议 Java 像 "don't do FullGC from 7:00 to 16:00"?

即使使用 -XX:+DisableExplicitGC 也可以通过调用像 GC.class_histogram

这样的堆检查操作来强制执行 Full GC

通过 JMX

MBean:     com.sun.management:type=DiagnosticCommand
Operation: gcClassHistogram

从命令行

jcmd <pid> GC.class_histogram

正在修补 System.gc

或者,您可以通过使用自定义 JVM_GC 实现预加载共享库来拦截 System.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>