Java: Как Вы действительно вызываете GC с помощью ForceGargabeCollection JVMTI?

Я не ищу обычное, "можно только подсказать 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?

Любой полный и компилируемый пример приветствовался бы.

23
задан Wilfred Hughes 15 December 2014 в 12:02
поделиться

1 ответ

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% случаев: явная сборка мусора - корень всего зла

10
ответ дан 29 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: