• # Generer un heap dump et lire avec jhat

    Posté par . En réponse au message Voir les créations d'objets intermédiaires en Scala. Évalué à 2.

    Ce que j'ai essaye c'est de generer fichier qui contient un heap dump la classe HotSpotDiagnosticMXBean puis de le lire avec jhat.

    Je peux alors voir la liste des classes instanciees et le nombre d'instances.

    J'aimerais bien voir l'economie de creation d'objets qu'on obtient avec les stream. Mais si je compare avec et sans Stream (il faut aussi que je regarde du cote des view qui ont l'air plus approprie pour une lecture paresseuse d'une liste), et que j'ajoute des map inutiles, je ne vois aucune difference. Je me demande si le garbage collector ne passe pas avant que mon dump ne soit execute.

    import java.time.ZonedDateTime
    import java.time.format.DateTimeFormatter
    import com.sun.management.HotSpotDiagnosticMXBean
    object CreateList {
     val HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic"
     def printDump(fileName: String): Unit = {
     val bean = initDiagnosticBean()
     bean.dumpHeap(fileName, true)
     }
     def initDiagnosticBean(): HotSpotDiagnosticMXBean = {
     import com.sun.management.HotSpotDiagnosticMXBean
     import java.lang.management.ManagementFactory
     val server = ManagementFactory.getPlatformMBeanServer
     ManagementFactory.newPlatformMXBeanProxy(server, HOTSPOT_BEAN_NAME, classOf[HotSpotDiagnosticMXBean])
     }
     def apply(): Unit = {
     val alphabet = ('a' to 'z').map(_.toString)
     val binomes = for {
     first <- 0 to 25
     second <- 0 to 25
     } yield {
     alphabet(first) + alphabet(second)
     }
     binomes.map(x => x).map(x => x).map(x => x).zip(binomes.tail).map {
     case (biAA, biAB) => biAB -> (biAA + " + 1")
     } takeRight 5 foreach println
     val time = formattedTime()
     printDump(s"dump_$time.txt")
     }
     def formattedTime(): String = ZonedDateTime.now.format(DateTimeFormatter.ISO_TIME)
    }
    object Main extends App {
     CreateList()
    }