Я изучаю реализацию мониторинга 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) {}
}