Last active
April 7, 2022 06:32
-
-
Save irgaly/fcbaa58193dce42645e596d33ecaad0a to your computer and use it in GitHub Desktop.
Gradle Memory Statistics
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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