第一次遇到这样的问题,网上脑补了一下。
这个现象是Java虚拟机的BUG,比较好的解释是,当开始GC的时候,强制让机器休眠,然后等超过2秒后唤醒机器,就有可能导致这个现象。原因在于虚拟机认为自己回收超时了。其实这2S时间CPU根本没有工作。
具体的解法应该是修改虚拟机获取时间的函数,调整为采用CPU上电工作时间,应该就不会发生问题了。
代码修复:
public static void fix() {
try {
Class clazz = Class.forName("java.lang.Daemons$FinalizerWatchdogDaemon");
Method method = clazz.getSuperclass().getDeclaredMethod("stop");
method.setAccessible(true);
Field field = clazz.getDeclaredField("INSTANCE");
field.setAccessible(true);
method.invoke(field.get(null));
}
catch (Throwable e) {
e.printStackTrace();
}
}
来源:
https://blog.csdn.net/yangyulong0622/article/details/125546628