Skip to content

Tans5/tHprofParser

Repository files navigation

A JVM memory dump HPROF file parser for JVM/Android.
Inspired by ASM's implementation.

Installation

dependencies {
	 // ...
    implementation 'io.github.tans5:thprofparser:1.0.0'
    // reduce hprof file size
    implementation 'io.github.tans5:thprofparser-reducer:1.0.0'
    // ...
}

Usage

Read and Write Hprof File

    @JvmStatic
    fun main(args: Array<String>) {
        val inputHprofFile = File("./demo/input/dump.hprof")
        val outputDir = File("./demo/output")
        if (!outputDir.exists()) {
            outputDir.mkdirs()
        }
        val outputHprofFile = File(outputDir, "output.hprof")
        if (!outputHprofFile.exists()) {
            outputHprofFile.createNewFile()
        }
        inputHprofFile.inputStream().use { inputStream ->
            outputHprofFile.outputStream().use { outputStream ->
                val reader = HprofReader(inputStream)
                val writer = HprofWriter(outputStream)
                val visitor = object : HprofVisitor(writer) {
                    override fun visitStringRecord(context: RecordContext<Record.StringRecord>) {
                        super.visitStringRecord(context)
                        println("Read string record: ${context.record.string}")
                    }

                    override fun visitHeapDumpRecord(
                        tag: Int,
                        timestamp: Long,
                        header: HprofHeader
                    ): HeapDumpRecordVisitor? {
                        return object : HeapDumpRecordVisitor(tag, timestamp, header,  super.visitHeapDumpRecord(tag, timestamp, header)) {
                            override fun visitInstanceDumpSubRecord(context: SubRecordContext<SubRecord.InstanceDumpSubRecord>) {
                                super.visitInstanceDumpSubRecord(context)
                                println("Read instance: ${context.subRecord.id}")
                            }
                        }
                    }
                }
                reader.accept(visitor)
            }
        }
    }

Reduce Hprof File Size

    @JvmStatic
    fun main(args: Array<String>) {
        val inputHprofFile = File("./demo/input/dump.hprof")
        val outputReducedFile = File("./demo/output/reduced.zip")
        val cost = measureTime {
            reduceHprofFile(
                inputFile = inputHprofFile,
                outputFile = outputReducedFile
            )
        }
        println("Reduce profile cost: $cost")
    }

About

A JVM memory dump HPROF file parser for JVM/Android. Inspired by ASM's implementation.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages