【问题标题】:Schedule FullGC with DisableExplicitGC enabled在启用 DisableExplicitGC 的情况下安排 FullGC
【发布时间】:2020-01-07 10:03:03
【问题描述】:

所以问题是我想禁用显式 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】:

    即使使用-XX:+DisableExplicitGC,也可以通过调用像GC.class_histogram 这样的堆检查操作来强制执行完全GC

    通过 JMX

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

    从命令行

    jcmd <pid> GC.class_histogram
    

    补丁系统.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>
    

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      相关资源
      最近更新 更多