Dump heap
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 5099cb9..98be887 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt
@@ -72,6 +72,23 @@ import java.io.File import java.io.IOException +import com.sun.management.HotSpotDiagnosticMXBean +import java.lang.management.ManagementFactory +import java.time.Instant +import java.time.format.DateTimeFormatter + +object HeapDumper { + private val hotSpotDiagnostic: HotSpotDiagnosticMXBean by lazy { + val connection = ManagementFactory.getPlatformMBeanServer() + val name = "com.sun.management:type=HotSpotDiagnostic" + ManagementFactory.newPlatformMXBeanProxy(connection, name, HotSpotDiagnosticMXBean::class.java) + } + + fun createHeapDump(file: String, live: Boolean) { + hotSpotDiagnostic.dumpHeap(file, live) + } +} + private val K2JSCompilerArguments.granularity: JsGenerationGranularity get() = when { this.irPerModule -> JsGenerationGranularity.PER_MODULE @@ -456,6 +473,10 @@ sourceModule.getModuleDescriptor(it) } + if (moduleFragment.name.asString() in setOf("<space.app:app-web>", "<space:all-js>")) { + HeapDumper.createHeapDump("/Users/sergej.jaskiewicz/Developer/kotlin/heap-dumps/before-serialization-v1-${moduleFragment.name}-${DateTimeFormatter.ISO_INSTANT.format(Instant.now())}.hprof", false) + } + val metadataSerializer = KlibMetadataIncrementalSerializer( environmentForJS.configuration,
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index 1a3ba94..db5a753 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.ir.backend.js +import com.sun.management.HotSpotDiagnosticMXBean import org.jetbrains.kotlin.backend.common.linkage.issues.checkNoUnboundSymbols import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel @@ -24,6 +25,9 @@ import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.RuntimeDiagnostic import org.jetbrains.kotlin.name.FqName +import java.lang.management.ManagementFactory +import java.time.Instant +import java.time.format.DateTimeFormatter class CompilerResult( val outputs: Map<TranslationMode, CompilationOutputs>, @@ -36,6 +40,18 @@ val moduleFragmentToUniqueName: Map<IrModuleFragment, String>, ) +object HeapDumper { + private val hotSpotDiagnostic: HotSpotDiagnosticMXBean by lazy { + val connection = ManagementFactory.getPlatformMBeanServer() + val name = "com.sun.management:type=HotSpotDiagnostic" + ManagementFactory.newPlatformMXBeanProxy(connection, name, HotSpotDiagnosticMXBean::class.java) + } + + fun createHeapDump(file: String, live: Boolean) { + hotSpotDiagnostic.dumpHeap(file, live) + } +} + fun compile( depsDescriptors: ModulesStructure, phaseConfig: PhaseConfig, @@ -54,6 +70,16 @@ val (moduleFragment: IrModuleFragment, dependencyModules, irBuiltIns, symbolTable, deserializer, moduleToName) = loadIr(depsDescriptors, irFactory, verifySignatures, filesToLower, loadFunctionInterfacesIntoStdlib = true) + if (moduleFragment.name.asString() in setOf("<space.app:app-web>", "<space:all-js>")) { + HeapDumper.createHeapDump( + "/Users/sergej.jaskiewicz/Developer/kotlin/heap-dumps/after-serialization-v1-${moduleFragment.name}-${ + DateTimeFormatter.ISO_INSTANT.format( + Instant.now() + ) + }.hprof", false + ) + } + return compileIr( moduleFragment, depsDescriptors.mainModule,
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt index 67960ee..6d10c8a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt
@@ -4,12 +4,14 @@ package org.jetbrains.kotlin.ir.backend.js.ic +import com.sun.management.HotSpotDiagnosticMXBean import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.serialization.IrInterningService import org.jetbrains.kotlin.backend.common.serialization.cityHash64 import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.* +import org.jetbrains.kotlin.ir.backend.js.HeapDumper import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment import org.jetbrains.kotlin.ir.declarations.* @@ -25,9 +27,24 @@ import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize import org.jetbrains.kotlin.utils.newHashSetWithExpectedSize import java.io.File +import java.lang.management.ManagementFactory import java.nio.file.Files +import java.time.Instant +import java.time.format.DateTimeFormatter import java.util.EnumSet +object HeapDumper { + private val hotSpotDiagnostic: HotSpotDiagnosticMXBean by lazy { + val connection = ManagementFactory.getPlatformMBeanServer() + val name = "com.sun.management:type=HotSpotDiagnostic" + ManagementFactory.newPlatformMXBeanProxy(connection, name, HotSpotDiagnosticMXBean::class.java) + } + + fun createHeapDump(file: String, live: Boolean) { + hotSpotDiagnostic.dumpHeap(file, live) + } +} + fun interface JsIrCompilerICInterface { fun compile( allModules: Collection<IrModuleFragment>, @@ -660,6 +677,18 @@ ) var loadedIr = jsIrLinkerLoader.loadIr(dirtyFileExports) + val moduleName = loadedIr.loadedFragments[mainLibraryFile]?.name?.asString() + if (moduleName in setOf("<space.app:app-web>", "<space:all-js>")) { + HeapDumper.createHeapDump( + "/Users/sergej.jaskiewicz/Developer/kotlin/heap-dumps/after-serialization-IC-v1-${moduleName}-${ + DateTimeFormatter.ISO_INSTANT.format( + Instant.now() + ) + }.hprof", + false + ) + } + var iterations = 0 var lastDirtyFiles: KotlinSourceFileMap<KotlinSourceFileExports> = dirtyFileExports