Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何知道谁调用了System.gc()?_Java_Logging_Garbage Collection_Stack Trace - Fatal编程技术网

Java 我如何知道谁调用了System.gc()?

Java 我如何知道谁调用了System.gc()?,java,logging,garbage-collection,stack-trace,Java,Logging,Garbage Collection,Stack Trace,在一个正在运行的系统中,我们看到很多“完整GC(system)”,这表示有人触发了system.GC() 有没有办法找出代码中发生这种情况的地方 我确实搜索了所有可用的源,但没有发现任何可疑的地方,所以它一定在某个地方,可能是在同一个容器中运行的另一个应用程序,也可能是容器本身。您可以将运行时类更改为记录文件调用gc()的位置(System.gc()调用Runtime.gc() 要执行此操作,请编辑副本,编译并将其添加到您的-Xbootclasspath/p: 然而,大量的完整GC更可能是由于幸

在一个正在运行的系统中,我们看到很多“完整GC(system)”,这表示有人触发了system.GC()

有没有办法找出代码中发生这种情况的地方


我确实搜索了所有可用的源,但没有发现任何可疑的地方,所以它一定在某个地方,可能是在同一个容器中运行的另一个应用程序,也可能是容器本身。

您可以将运行时类更改为记录文件调用gc()的位置(System.gc()调用Runtime.gc()

要执行此操作,请编辑副本,编译并将其添加到您的
-Xbootclasspath/p:

然而,大量的完整GC更可能是由于幸存者空间不足或完整的终身空间

你能试试跑步吗

jstat -gccause {pid} 5s 
在Java中,不能“调用”垃圾收集器。如果您在调用方法System.gc()时看到错误,vm只会将其作为运行垃圾回收器的建议,但无法保证有效调用。是一个内部进程,即使在堆栈中需要空间时不调用它,也会自动调用它


如果您看到很多完整的GC,这可能是应用程序没有正确释放资源的症状。您应该监视堆以查看问题所在

您使用的某个库可能会调用显式gc。您可以使用
-XX:-DisableExplicitGC
禁用它,并查看它是否在日志中停止
Full GC
使用以下大括号脚本&jvisualvmbtrace plugin将轻松显示
System.GC
的调用者

// import all BTrace annotations
import com.sun.btrace.annotations.*;

// import statics from BTraceUtils class
import static com.sun.btrace.BTraceUtils.*;

// @BTrace annotation tells that this is a BTrace program
@BTrace
public class GCcaller {
    // @OnMethod annotation tells where to probe.
    // In this example, we are interested in entry
    // into the Thread.start() method.
    @OnMethod(
        clazz="java.lang.System",
        method="gc"
    )
    public static void func() {
        // println is defined in BTraceUtils
        // you can only call the static methods of BTraceUtils
        println("about to start a System.gc!");
        jstack();
    }
}

简单的解决方案:在调试模式下启动应用程序,并在
System.gc()
(以及
Runtime.gc()
)处放置一个方法断点,以便更好地衡量)。@Aaron,你有50多个问题没有被接受的答案。也许你可以跟进答案,让他们被接受。我明白你的意思。我的一些问题可能太复杂了,无法回答;现有答案不令人满意(如或)。很好;这样,我可以快速区分显式GC调用和“内存不足”调用。在我的例子中,一个工具被用来分析这个问题,它说“449个集合中有17个(3786%)是由System.gc()调用触发的。”但就我所见,您不能真正更改运行时类,因为gc()是本机方法。您可以更改System.gc(),但这不是唯一可以调用Runtime.getRuntime().gc()的地方-一个示例是sun.management.MemoryImpl。当然,图书馆也可以这样称呼它,所以登录系统可能不会告诉你一切。