已启用DisableExplicitGC的计划FullGC

问题描述 投票:0回答:1

因此问题是我想禁用显式GC,以确保没有库可以使用System.gc()“强制” FullGC。但是我仍然想对FullGC何时发生进行一些控制。这可行吗?我的意思是可以通过JMX或某些Tomcat管理工具强制(或强烈建议)FullGC吗?还是cron中有一些命令行?

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

据我所知,FullGC将通过-XX:+DisableExplicitGC选项随机发生。当Java认为有必要这样做时,它将发生。

或者也许有某种方法可以向Java建议诸如“从7:00到16:00不执行FullGC”?

garbage-collection jvm tomcat7
1个回答
0
投票
通过JMX

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

从命令行

jcmd <pid> GC.class_histogram

Patching System.gc

或者,您可以通过使用自定义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>
© www.soinside.com 2019 - 2024. All rights reserved.