В контексте базы данных в памяти мы используем память вне кучи в сочетании со сборщиком горячей точки G1.
Однако, когда использование памяти вне кучи достигает MaxDirectMemorySize, полный сборщик мусора запускается кодом JDK с использованием System.gc(). Это вызывает долгую и болезненную остановку мирового GC, который также, похоже, помещает весь текущий живой набор в старое поколение, минуя выживший (и, таким образом, увеличивая проблемы кумовства). Этого не происходит при установке -XX:+ExplicitGCInvokesConcurrent: сборщик мусора работает намного быстрее и уважает оставшиеся в живых.
Поскольку System.gc() используется внутри JDK, почему эта опция не включена по умолчанию в горячей точке? Вызывает ли этот флаг теоретические или практические проблемы? Или это просто из соображений совместимости? Есть ли у кого-нибудь опыт использования этой опции в производственной среде и возникали ли с ней проблемы?
Подробнее здесь: https://stackoverflow.com/questions/338 ... g1-collect