[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:
committed by
Space Team
parent
dbdcce0655
commit
58f7dd1c83
@@ -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) } +
|
||||||
|
|||||||
+1
-1
@@ -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<*, *, *>>
|
||||||
|
|||||||
+3
-1
@@ -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,
|
||||||
|
|||||||
+64
@@ -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(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user