在启用 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(×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>
所以问题是我想禁用显式 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
通过 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(×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>