Skip to content

Instantly share code, notes, and snippets.

@irgaly
Last active April 7, 2022 06:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save irgaly/fcbaa58193dce42645e596d33ecaad0a to your computer and use it in GitHub Desktop.
Save irgaly/fcbaa58193dce42645e596d33ecaad0a to your computer and use it in GitHub Desktop.
Gradle Memory Statistics
fun Long.readable(): String {
if (this < 1024) return "${this}B"
val z = (63 - countLeadingZeroBits()) / 10
return "%.1f%sB".format(toDouble() / (1L shl z * 10), " KMGTPE"[z])
}
class MemoryStatusListener :
org.gradle.process.internal.health.memory.JvmMemoryStatusListener,
org.gradle.process.internal.health.memory.OsMemoryStatusListener {
var jvmStatus: JvmMemoryStatus? = null
var osStatus: OsMemoryStatus? = null
override fun onJvmMemoryStatus(jvmMemoryStatus: JvmMemoryStatus) {
jvmStatus = jvmMemoryStatus
println("jvmStatus: ${jvmMemoryStatus.string()}")
}
override fun onOsMemoryStatus(osMemoryStatus: OsMemoryStatus) {
osStatus = osMemoryStatus
println("osStatus: ${osMemoryStatus.string()}")
}
fun JvmMemoryStatus.string(): String {
return "JVM [ used ${committedMemory.readable()} / ${maxMemory.readable()} ${floor(100f * (committedMemory.toFloat() / maxMemory.toFloat()))}% ]"
}
fun OsMemoryStatus.string(): String {
val used = totalPhysicalMemory - freePhysicalMemory
return "OS [ used ${used.readable()} / ${totalPhysicalMemory.readable()} ${floor(100f * (used.toFloat() / totalPhysicalMemory.toFloat()))}% ]"
}
}
val memoryStatusListener = MemoryStatusListener()
serviceOf<org.gradle.process.internal.health.memory.MemoryManager>().apply {
addListener(memoryStatusListener as org.gradle.process.internal.health.memory.JvmMemoryStatusListener)
addListener(memoryStatusListener as org.gradle.process.internal.health.memory.OsMemoryStatusListener)
}
abstract class MemoryUsage @Inject constructor(private val exec: ExecOperations) :
BuildService<BuildServiceParameters.None>,
org.gradle.tooling.events.OperationCompletionListener {
fun Long.readable2(): String {
if (this < 1024) return "${this}B"
val z = (63 - countLeadingZeroBits()) / 10
return "%.1f%sB".format(toDouble() / (1L shl z * 10), " KMGTPE"[z])
}
override fun onFinish(event: FinishEvent) {
/*
val ps = exec.execute("ps aux --sort -rss | head -n 8")
println(ps)
*/
val osMx =
ManagementFactory.getOperatingSystemMXBean() as com.sun.management.OperatingSystemMXBean
val used = osMx.totalPhysicalMemorySize - osMx.freePhysicalMemorySize
println("OS Bean Physical [ used ${used.readable2()} / ${osMx.totalPhysicalMemorySize.readable2()} ]")
val usedSwap = osMx.totalSwapSpaceSize - osMx.freeSwapSpaceSize
println("OS Bean Swap [ used ${usedSwap.readable2()} / ${osMx.totalSwapSpaceSize.readable2()} ]")
val memoryMx = ManagementFactory.getMemoryMXBean()
println("JVM Bean Heap [ used ${memoryMx.heapMemoryUsage.used.readable2()} / ${memoryMx.heapMemoryUsage.max.readable2()} ]")
val metaspaceMx = ManagementFactory.getMemoryPoolMXBeans().first { it.name == "Metaspace" }
println("MemoryPool Bean Metaspace [ used ${metaspaceMx.usage.used.readable2()} / ${metaspaceMx.usage.max.readable2()} ]")
val beans = ManagementFactory.getMemoryPoolMXBeans()
val hoge = beans
}
}
project.serviceOf<BuildEventsListenerRegistry>().onTaskCompletion(
gradle.sharedServices.registerIfAbsent("memoryusage", MemoryUsage::class) {}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment