Java: How do you really force a GC using JVMTI's ForceGargabeCollection?

前端 未结 4 1939
终归单人心
终归单人心 2020-12-01 16:01

I\'m not looking for the usual \"you can only hint the GC in Java using System.gc()\" answers, this is not at all what this question is about.

My questions

4条回答
  •  一生所求
    2020-12-01 16:30

    NetBeans, at least, uses System.gc(): http://hg.netbeans.org/main/annotate/9779f138a9c9/openide.actions/src/org/openide/actions/GarbageCollectAction.java (this is for the little button that shows current heap and lets you start GC). If you follow that link, you'll see that they explicitly run finalizers. If you have a few gig of disk space free, and want to investigate the code yourself, it's available via Mercurial: hg clone http://hg.netbeans.org/main/

    As far as I can tell, the "System.gc() is just a hint" dogma originates in pedantic interpretation of the JLS and JVM Spec, which allow for Java implementations that don't have a garbage-collected heap. That, and an incomplete reading of the JavaDoc:

    Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

    Read the second sentence: "best effort to reclaim space" is a lot stronger than "hint."

    That said, there's rarely a reason to call System.gc(). With apologies to Knuth:

    We should forget about memory management, say about 97% of the time: explicit garbage collection is the root of all evil

提交回复
热议问题