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