Я не ищу обычное, "можно только подсказать GC в Java с помощью System.gc ()" ответы, это нисколько не, о чем этот вопрос.
Мои вопросы не субъективны и основаны на действительности: GC может быть вызван в Java для факта. Много программ, которые мы используем ежедневно, делает это: ИДЕЯ IntelliJ, NetBeans, VisualVM.
Они все могут вынудить GC произойти.
Как это сделано?
Я беру его, они все используют JVMTI, и более конкретно ForceGarbageCollection (заметьте "Силу"), но как я могу попробовать его за меня?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
Также обратите внимание, что этот вопрос не о том, "почему" я хотел бы сделать это: "почему" может быть "любопытство" или, "мы пишем программу, подобную VisualVM", и т.д.
Вопрос действительно, "как Вы вызываете GC с помощью ForceGarbageCollection JVMTI"?
JVM должна быть запущена с какими-либо специальными параметрами?
Какой-либо JNI требуется? Если так, что код точно?
Это только работает над Sun VMs?
Любой полный и компилируемый пример приветствовался бы.
NetBeans, по крайней мере, использует System.gc (): http://hg.netbeans.org/main/annotate/9779f138a9c9/openide .actions / src / org / openide / actions / GarbageCollectAction.java (это маленькая кнопка, которая показывает текущую кучу и позволяет запустить сборщик мусора). Если вы перейдете по этой ссылке, вы увидите, что они явно запускают финализаторы.Если у вас есть несколько гигабайт свободного места на диске и вы хотите самостоятельно изучить код, он доступен через Mercurial: hg clone http://hg.netbeans.org/main/
Насколько я могу судить, догма «System.gc () - это всего лишь намек» берет свое начало в педантичной интерпретации JLS и JVM Spec, которые допускают реализации Java, которые не имеют кучи со сборщиком мусора. Это и неполное чтение JavaDoc :
Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на переработку неиспользуемых объектов в {{1} } чтобы сделать память, которую они в настоящее время занимают, доступной для быстрого повторного использования. Когда управление возвращается из вызова метода , виртуальная машина Java сделала все возможное, чтобы освободить пространство для всех отброшенных объектов.
Прочтите второе предложение: «Лучшее усилие для освобождения места» намного сильнее, чем «намек».
Тем не менее, редко есть причина вызывать System.gc ()
. С извинениями перед Кнутом:
Мы должны забыть об управлении памятью, скажем, примерно в 97% случаев: явная сборка мусора - корень всего зла