因此问题是我想禁用显式GC,以确保没有库可以使用System.gc()
“强制” FullGC。但是我仍然想对FullGC何时发生进行一些控制。这可行吗?我的意思是可以通过JMX或某些Tomcat管理工具强制(或强烈建议)FullGC吗?还是cron中有一些命令行?
强制FullGC的动机是确保它不会在一天中发生。
据我所知,FullGC将通过-XX:+DisableExplicitGC
选项随机发生。当Java认为有必要这样做时,它将发生。
或者也许有某种方法可以向Java建议诸如“从7:00到16:00不执行FullGC”?
MBean: com.sun.management:type=DiagnosticCommand
Operation: gcClassHistogram
jcmd <pid> GC.class_histogram
或者,您可以通过使用自定义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>