我不是在寻找通常的“你只能使用Java暗示GC系统.gc()”答案,这根本不是这个问题的目的。
我的问题不是主观的,而是基于现实:GCcan在 Java 中是被迫的。我们日常使用的很多程序都这样做:IntelliJ IDEA、NetBeans、VisualVM。
他们都可以forceGC 发生。
它是如何完成的?
我认为他们都在使用 JVMTI,更具体地说强制垃圾回收(注意“力”)但是我怎样才能自己尝试呢?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
另请注意,这个问题不是关于“为什么”我想这样做:“为什么”可能是“好奇心”或“我们正在编写一个类似于 VisualVM 的程序”等。
问题实际上是“如何使用 JVMTI 的 ForceGarbageCollection 强制执行 GC”?
JVM 是否需要使用任何特殊参数启动?
是否需要 JNI?如果是这样,具体是什么代码?
它仅适用于 Sun VM 吗?
任何完整且可编译的示例都将受到欢迎。
NetBeans 至少使用 System.gc():http://hg.netbeans.org/main/annotate/9779f138a9c9/openide.actions/src/org/openide/actions/GarbageCollectAction.java http://hg.netbeans.org/main/annotate/9779f138a9c9/openide.actions/src/org/openide/actions/GarbageCollectAction.java(这是用于显示当前堆并让您启动 GC 的小按钮)。如果您点击该链接,您将看到它们显式运行终结器。如果您有几 GB 的可用磁盘空间,并且想要自己研究代码,可以通过 Mercurial 获得:hg clone http://hg.netbeans.org/main/
据我所知,“System.gc() 只是一个提示”教条源于 JLS 和 JVM 规范的迂腐解释,它允许没有垃圾收集堆的 Java 实现。那,以及不完整的阅读JavaDoc http://java.sun.com/javase/6/docs/api/java/lang/System.html#gc():
调用 gc 方法表明
Java虚拟机花费精力
致力于回收未使用的对象
为了让他们的记忆
目前可快速占用
重复使用。当控制权从
方法调用,Java 虚拟机
已尽最大努力回收
与所有废弃物体的空间。
阅读第二句话:“尽力回收空间”比“提示”强得多。
也就是说,很少有理由打电话System.gc()
。向高德纳致歉:
我们应该忘记内存管理,大约 97% 的情况下:显式垃圾回收是万恶之源
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)