[Daemon] Change default Kotlin daemon JVM options

Now, the Kotlin daemon enables parallel GC and uses code cache flushing by default. Also, the default reserved code cache size is adjusted.

^KT-64283 Verification Pending
This commit is contained in:
Alexander.Likhachev
2023-12-21 17:29:07 +01:00
committed by Space Team
parent dbdcce0655
commit 58f7dd1c83
4 changed files with 76 additions and 3 deletions
@@ -470,11 +470,18 @@ object KotlinCompilerClient {
if (javaVersion != null && javaVersion >= 16) if (javaVersion != null && javaVersion >= 16)
listOf("--add-exports", "java.base/sun.nio.ch=ALL-UNNAMED") listOf("--add-exports", "java.base/sun.nio.ch=ALL-UNNAMED")
else emptyList() else emptyList()
val jvmArguments = daemonJVMOptions.mappers.flatMap { it.toArgs("-") }
val additionalOptimizationOptions = listOfNotNull(
"-XX:+UseCodeCacheFlushing",
// enable parallel gc only if it's not explicitly disabled and no other GC is selected
"-XX:+UseParallelGC".takeIf { jvmArguments.none { it == "-XX:-UseParallelGC" || (it.startsWith("-XX:+Use") && it.endsWith("GC")) } },
)
val args = listOf( val args = listOf(
javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator) javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator)
) + ) +
platformSpecificOptions + platformSpecificOptions +
daemonJVMOptions.mappers.flatMap { it.toArgs("-") } + jvmArguments +
additionalOptimizationOptions +
javaIllegalAccessWorkaround + javaIllegalAccessWorkaround +
COMPILER_DAEMON_CLASS_FQN + COMPILER_DAEMON_CLASS_FQN +
daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } + daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } +
@@ -181,7 +181,7 @@ fun Iterable<String>.filterExtractProps(vararg groups: OptionsGroup, prefix: Str
data class DaemonJVMOptions( data class DaemonJVMOptions(
var maxMemory: String = "", var maxMemory: String = "",
var maxMetaspaceSize: String = "", var maxMetaspaceSize: String = "",
var reservedCodeCacheSize: String = "", var reservedCodeCacheSize: String = "320m",
var jvmParams: MutableCollection<String> = arrayListOf() var jvmParams: MutableCollection<String> = arrayListOf()
) : OptionsGroup { ) : OptionsGroup {
override val mappers: List<PropMapper<*, *, *>> override val mappers: List<PropMapper<*, *, *>>
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.daemon
import org.jetbrains.kotlin.cli.common.CompilerSystemProperties import org.jetbrains.kotlin.cli.common.CompilerSystemProperties
import org.jetbrains.kotlin.daemon.client.CompileServiceSession import org.jetbrains.kotlin.daemon.client.CompileServiceSession
import org.jetbrains.kotlin.daemon.client.DaemonReportMessage
import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets
import org.jetbrains.kotlin.daemon.client.KotlinCompilerClient import org.jetbrains.kotlin.daemon.client.KotlinCompilerClient
import org.jetbrains.kotlin.daemon.common.CompileService import org.jetbrains.kotlin.daemon.common.CompileService
@@ -74,6 +75,7 @@ abstract class BaseDaemonSessionTest {
jvmOptions: DaemonJVMOptions = defaultDaemonJvmOptions, jvmOptions: DaemonJVMOptions = defaultDaemonJvmOptions,
daemonOptions: DaemonOptions = defaultDaemonOptions, daemonOptions: DaemonOptions = defaultDaemonOptions,
logFile: File? = null, logFile: File? = null,
daemonMessagesCollector: MutableCollection<DaemonReportMessage>? = null,
): CompileServiceSession { ): CompileServiceSession {
val actualJvmOptions = logFile?.let { jvmOptions.withLogFile(it) } ?: jvmOptions val actualJvmOptions = logFile?.let { jvmOptions.withLogFile(it) } ?: jvmOptions
println("Leasing a session with $actualJvmOptions and $daemonOptions") println("Leasing a session with $actualJvmOptions and $daemonOptions")
@@ -85,7 +87,7 @@ abstract class BaseDaemonSessionTest {
clientMarkerFile, clientMarkerFile,
actualJvmOptions, actualJvmOptions,
daemonOptions, daemonOptions,
DaemonReportingTargets(out = System.err), DaemonReportingTargets(messages = daemonMessagesCollector, out = System.err),
autostart = true, autostart = true,
leaseSession = true, leaseSession = true,
sessionAliveFlagFile = sessionMarkerFile, sessionAliveFlagFile = sessionMarkerFile,
@@ -0,0 +1,64 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.daemon
import org.jetbrains.kotlin.daemon.client.DaemonReportMessage
import org.jetbrains.kotlin.daemon.common.filterExtractProps
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import kotlin.test.assertContains
import kotlin.test.assertEquals
class JvmArgumentsModificationTest : BaseDaemonSessionTest() {
@DisplayName("Default jvm arguments contain expected gc and code cache options")
@Test
fun testDefaultGcArguments() {
val commandParts = leaseSessionAndExtractCommand()
val xmxArgument = commandParts.single { it.startsWith("-Xmx") }
val codeCacheSizeArgument = commandParts.single { it.startsWith("-XX:ReservedCodeCacheSize") }
val useGcArgument = commandParts.single { it.startsWith("-XX:+Use") && it.endsWith("GC") }
assertEquals("-Xmx384m", xmxArgument)
assertEquals("-XX:ReservedCodeCacheSize=320m", codeCacheSizeArgument)
assertEquals("-XX:+UseParallelGC", useGcArgument)
assertContains(commandParts, "-XX:+UseCodeCacheFlushing")
}
@DisplayName("Gc and code cache options may be properly overridden")
@Test
fun testModification() {
val commandParts = leaseSessionAndExtractCommand(listOf("Xmx400m", "XX:ReservedCodeCacheSize=280m", "XX:+UseG1GC"))
val xmxArgument = commandParts.single { it.startsWith("-Xmx") }
val codeCacheSizeArgument = commandParts.single { it.startsWith("-XX:ReservedCodeCacheSize") }
val useGcArgument = commandParts.single { it.startsWith("-XX:+Use") && it.endsWith("GC") }
assertEquals("-Xmx400m", xmxArgument)
assertEquals("-XX:ReservedCodeCacheSize=280m", codeCacheSizeArgument)
assertEquals("-XX:+UseG1GC", useGcArgument)
assertContains(commandParts, "-XX:+UseCodeCacheFlushing")
}
@DisplayName("-XX:-UseParallelGC is handled")
@Test
fun testDisablingParallelGC() {
val commandParts = leaseSessionAndExtractCommand(listOf("XX:-UseParallelGC"))
assert(commandParts.none { it.startsWith("-XX:+Use") && it.endsWith("GC") }) {
"Expected no explicitly enabled garbage collector via JVM arguments: $commandParts"
}
}
private fun leaseSessionAndExtractCommand(additionalJvmArguments: List<String> = emptyList()): List<String> {
val daemonMessagesCollector = mutableListOf<DaemonReportMessage>()
leaseSession(
daemonMessagesCollector = daemonMessagesCollector,
jvmOptions = defaultDaemonJvmOptions.copy().apply {
jvmParams.addAll(
additionalJvmArguments.filterExtractProps(mappers, "", restMapper)
)
}
)
val prefix = "starting the daemon as: "
return daemonMessagesCollector.single { it.message.startsWith(prefix) }.message.substring(prefix.length).split(" ")
}
}