Сохранение памяти mbean JMX и сборка мусора

Я изучаю реализацию мониторинга JMX, и мне хотелось узнать, как сервер JMX MBean управляет памятью и когда он выпускает свои зарегистрированные mbean-компоненты.

Я создал тривиальный пример, поигрался с ним и заметил, что объекты не были выпущены, и я смог отправить их через JConsole спустя долгое время после того, как должен был сработать сборщик мусора. Это заставляет меня поверить в то, что существует огромный потенциал утечки памяти в производственной среде и может произойти чрезмерный рост памяти. Например, здесь я создал 100 beans и отправил им сообщение через JConsole:

trait OrderTrackerMBean {
  def getOrderId : Int
  def setOrderId(orderId:Int)
}

class OrderTracker extends OrderTrackerMBean {
  var orderId = 0
  override def getOrderId: Int = orderId
  override def setOrderId(_orderId: Int)= {
    println(s"setting order id ${_orderId}")
    orderId = _orderId
  }

}

object TestJMX extends App {
  val s: MBeanServer = ManagementFactory.getPlatformMBeanServer
  0 to 100 map {
    x =>
      val objectName: ObjectName = new ObjectName(s"a.b.c.$x:type=basic,name=game")
      val orderTrackerBean = new OrderTracker
      s.registerMBean(orderTrackerBean ,objectName)
  }
  while(true) {}
}

введите описание изображения здесь


person Avner Barr    schedule 08.05.2018    source источник


Ответы (1)


Вы создаете 100 объектов Mbean, и они будут работать в течение жизненного цикла JVM. На него по-прежнему будут ссылаться и, следовательно, он не будет собираться во время сборки мусора.

person Eby Jacob    schedule 08.05.2018