All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.finagle.mux.lease.exp.MemoryPool.scala Maven / Gradle / Ivy

There is a newer version: 6.39.0
Show newest version
package com.twitter.finagle.mux.lease.exp

import java.lang.management.{GarbageCollectorMXBean, MemoryPoolMXBean, MemoryUsage}
import javax.management.ObjectName
import com.twitter.conversions.storage.longToStorageUnitableWholeNumber
import com.twitter.util.StorageUnit

private[lease] trait MemoryPool {
  def snapshot(): MemoryPoolInfo
}

private[lease] class BeanMemoryPool(pool: MemoryPoolMXBean) extends MemoryPool {
  def snapshot(): MemoryPoolInfo = new MemoryUsageInfo(pool.getUsage())
}

private[lease] class FakeMemoryPool(original: MemoryPoolInfo) extends MemoryPool {
  @volatile private[this] var _snapshot: MemoryPoolInfo = original
  def setSnapshot(snap: MemoryPoolInfo) {
    _snapshot = snap
  }

  def snapshot() = _snapshot
}

private[lease] class FakeGarbageCollectorMXBean(
  @volatile var getCollectionCount: Long,
  @volatile var getCollectionTime: Long
) extends GarbageCollectorMXBean {
  private[this] def ??? = throw new UnsupportedOperationException("not supported")

  def getMemoryPoolNames(): Array[String] = ???
  def isValid  = true
  def getName: String = ???
  def getObjectName: ObjectName = ???
}

private[lease] trait MemoryPoolInfo {
  def used(): StorageUnit
  def committed(): StorageUnit
}

private[lease] class MemoryUsageInfo(usage: MemoryUsage) extends MemoryPoolInfo {
  def used(): StorageUnit = usage.getUsed().bytes
  def committed(): StorageUnit = usage.getCommitted().bytes
}

private[lease] case class FakeMemoryUsage(used: StorageUnit, committed: StorageUnit) extends MemoryPoolInfo

private[lease] class JvmInfo(val pool: MemoryPool, val collector: GarbageCollectorMXBean) {
  def committed(): StorageUnit = pool.snapshot().committed()
  def used(): StorageUnit = pool.snapshot().used()
  def generation(): Long = collector.getCollectionCount()

  def remaining(): StorageUnit = {
    val snap = pool.snapshot()
    snap.committed() - snap.used()
  }

  def record(lr: LogsReceiver, state: String) {
    val snap = pool.snapshot()

    lr.record("com_%s".format(state), snap.committed().toString)
    lr.record("use_%s".format(state), snap.used().toString)
    lr.record("byte_%s".format(state), (snap.committed() - snap.used()).toString)
    lr.record("gen_%s".format(state), generation().toString)
  }

  override def toString(): String = "JvmInfo(committed" + committed() + ", generation=" + generation() + ", used=" + used() + ", remaining=" + remaining() + ")"
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy