@@ -7,6 +7,7 @@ import org.jetbrains.kotlin.ir.util.*
77import org.jetbrains.kotlin.ir.IrElement
88import java.io.File
99import java.io.FileOutputStream
10+ import java.lang.management.*
1011import java.nio.file.Files
1112import java.nio.file.Paths
1213import com.semmle.util.files.FileUtil
@@ -108,6 +109,7 @@ class KotlinExtractorExtension(
108109 logger.flush()
109110 logger.info(" Extraction for invocation TRAP file $invocationTrapFile " )
110111 logger.flush()
112+ logPeakMemoryUsage(logger, " before extractor" )
111113 if (System .getenv(" CODEQL_EXTRACTOR_JAVA_KOTLIN_DUMP" ) == " true" ) {
112114 logger.info(" moduleFragment:\n " + moduleFragment.dump())
113115 }
@@ -127,6 +129,7 @@ class KotlinExtractorExtension(
127129 fileTrapWriter.writeCompilation_compiling_files_completed(compilation, index, fileExtractionProblems.extractionResult())
128130 }
129131 loggerBase.printLimitedDiagnosticCounts(tw)
132+ logPeakMemoryUsage(logger, " after extractor" )
130133 logger.info(" Extraction completed" )
131134 logger.flush()
132135 val compilationTimeMs = System .currentTimeMillis() - startTimeMs
@@ -135,6 +138,25 @@ class KotlinExtractorExtension(
135138 loggerBase.close()
136139 }
137140 }
141+
142+ private fun logPeakMemoryUsage (logger : Logger , time : String ) {
143+ logger.info(" Peak memory usage $time " )
144+
145+ val beans = ManagementFactory .getMemoryPoolMXBeans()
146+ var heap: Long = 0
147+ var nonheap: Long = 0
148+ for (bean in beans) {
149+ val peak = bean.getPeakUsage().getUsed()
150+ val kind = when (bean.getType()) {
151+ MemoryType .HEAP -> { heap + = peak; " heap" }
152+ MemoryType .NON_HEAP -> { nonheap + = peak; " non-heap" }
153+ else -> " unknown"
154+ }
155+ logger.info(" * Peak for $kind bean ${bean.getName()} is $peak " )
156+ }
157+ logger.info(" * Total heap peak: $heap " )
158+ logger.info(" * Total non-heap peak: $nonheap " )
159+ }
138160}
139161
140162class KotlinExtractorGlobalState {
0 commit comments