From 29ca865bc607aa0b195255e161b86d6d417fa3cd Mon Sep 17 00:00:00 2001 From: Vladimir Koshelev Date: Mon, 26 Aug 2024 17:42:50 +0200 Subject: [PATCH] [pycharm] enable appcds for PyCharm PY-75476 GitOrigin-RevId: d20fd55316fb6049f5f1effe6e47248aa5a46555 --- .../intellij/build/ProductProperties.kt | 11 ++++++++++ .../intellij/build/impl/BuildContextImpl.kt | 21 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt index 3200f4eb3cf0..28bff57eb271 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/ProductProperties.kt @@ -104,6 +104,17 @@ abstract class ProductProperties { */ var classLoader: String? = "com.intellij.util.lang.PathClassLoader" + + /** + * If `true`, the Class Data Sharing (CDS) feature will be enabled for the JVM and system.class.loader will be disabled. + * + * When enabled, the JVM will generate a shared archive file for the application's classes on the first startup, + * which can be reused in further launches. + * + * The location of the cds file is $SYSTEM/$shortProductName$Version.jsa + */ + var enableCds: Boolean = false + /** * Additional arguments which will be added to JVM command line in IDE launchers for all operating systems. */ diff --git a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt index d35696d86a4d..14f3f58e4075 100644 --- a/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt +++ b/platform/build-scripts/src/org/jetbrains/intellij/build/impl/BuildContextImpl.kt @@ -298,8 +298,25 @@ class BuildContextImpl internal constructor( override fun getAdditionalJvmArguments(os: OsFamily, arch: JvmArchitecture, isScript: Boolean, isPortableDist: Boolean): List { val jvmArgs = ArrayList() - productProperties.classLoader?.let { - jvmArgs.add("-Djava.system.class.loader=${it}") + val cacheMacroName = when (os) { + OsFamily.WINDOWS -> "%IDE_CACHE_DIR%" + OsFamily.MACOS -> "\$IDE_CACHE_DIR" + OsFamily.LINUX -> "\$IDE_CACHE_DIR" + } + + if (!productProperties.enableCds) { + productProperties.classLoader?.let { + jvmArgs.add("-Djava.system.class.loader=${it}") + } + } + else { + if (os == OsFamily.WINDOWS) { + jvmArgs.add("-XX:SharedArchiveFile=$cacheMacroName\\${productProperties.baseFileName}$buildNumber.jsa") + } + else { + jvmArgs.add("-XX:SharedArchiveFile=$cacheMacroName/${productProperties.baseFileName}$buildNumber.jsa") + } + jvmArgs.add("-XX:+AutoCreateSharedArchive") } jvmArgs.add("-Didea.vendor.name=${applicationInfo.shortCompanyName}")