У меня есть экземпляр zookeeper, который работал некоторое время ... (Java 1.7.0_131
, ZK 3.5.1-1
), с -Xmx10G -XX:+UseParallelGC
.
Недавно произошла смена руководства, ииспользование памяти в большинстве случаев в кворуме увеличилось с ~ 200 МБ до 2 ГБ +.Я взял jmap
дамп, и мне показалось интересным то, что было много byte[]
данных сериализации (> 1 ГБ), которые не имели корня GC, но не были собраны.
(Это ByteArrayOutputStream
, DataOutputStream
, org.apache.jute.BinaryOutputArchive
или HeapByteBuffer
, BinaryOutputArchive
).
Глядя на журнал gc, незадолго до изменения выборов полный GC выполнялся каждые 4 года.-5 минут.После выборов порог владения увеличивается с 1 до 15 (не более), и полный сборщик мусора запускается все реже и реже, в конце концов он даже не запускается в некоторые дни.
Через несколько дней, внезапно и таинственнодля меня что-то меняется, и объем памяти снова падает до ~ 200 МБ при работе Full GC каждые 4-5 минут.
Что меня смущает, так это то, что на такой памяти не может быть Root GC, ине получить полный GC.Я даже несколько раз пытался вызвать GC.run
из jcmd
.
Я задавался вопросом, удерживает ли что-то на родной земле ЗК эту память или протекает эту память ... что могло бы это объяснить.
Я ищу любые предложения по отладке;Я планирую обновить Java 1.8
, может быть, ZK 3.5.4
, но очень хотел бы узнать причину, прежде чем двигаться дальше.
До сих пор я использовал visualvm, GCviewer и Eclipse MAT.
(Сплошные вертикальные черные линии заполнены GC. Желтый - молодое поколение).