Как я могу сказать, кто вызывает System.gc ()? - PullRequest
7 голосов
/ 29 июля 2011

В работающей системе мы видим много «Full GC (System)», который указывает, что кто-то запускает System.gc ().

Есть ли способ узнать, где в коде это происходит?

Я выполнил поиск по всему доступному источнику, но не нашел ничего подозрительного, поэтому это должно быть где-то, вероятно, другое приложение, работающее в том же контейнере или самом контейнере.

Ответы [ 4 ]

8 голосов
/ 29 июля 2011

Вы можете изменить класс Runtime на запись, где gc () вызывается в файл (System.gc () вызывает Runtime.gc ())

Для этого отредактируйте копию, скомпилируйте ее и добавьте в свой -Xbootclasspath/p:

Однако большое количество Full GC, скорее всего, связано с недостаточным пространством для выживших или с полным пребыванием в аренде.

Можете ли вы попробовать запустить

jstat -gccause {pid} 5s 
3 голосов
/ 29 июля 2011

Некоторые библиотеки, которые вы используете, могут вызывать явный gc.Вы можете отключить его с помощью -XX:-DisableExplicitGC и посмотреть, остановится ли он Full GC в логах

2 голосов
/ 15 марта 2016

Использование следующего скрипта-скобки & jvisualvm с плагином btrace легко покажет вызывающего 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();
    }
}
1 голос
/ 29 июля 2011

В Java нельзя «вызвать» сборщик мусора.Если вы видите документацию при вызове метода System.gc (), vm просто принимает предложение запустить сборщик мусора, но нет гарантии, что он будет эффективно вызван.Это внутренний процесс, который будет вызываться автоматически, даже если вы не вызываете, когда ему нужно место в стеке.

Если вы видите много Full GC, это может быть признаком того, что приложение не освобождаетресурсы правильно.Вы должны контролировать кучу, чтобы увидеть, в чем проблема

...