Scripting: implement correct disposal of REPL state on finalization

#KT-47927 fixed
This commit is contained in:
Ilya Chernikov
2021-08-20 17:29:22 +02:00
committed by TeamCityServer
parent a45e31720c
commit 4243bafd1d
3 changed files with 32 additions and 1 deletions
@@ -8,7 +8,9 @@ package kotlin.script.experimental.jsr223.test
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
import org.jetbrains.kotlin.config.KotlinCompilerVersion
import org.junit.Assert
import org.junit.Ignore
import org.junit.Test
import java.lang.management.ManagementFactory
import javax.script.*
import kotlin.script.experimental.jvmhost.jsr223.KotlinJsr223ScriptEngineImpl
@@ -71,6 +73,29 @@ class KotlinJsr223ScriptEngineIT {
Assert.assertEquals(5, res2)
}
@Test
@Ignore // Probably not possible to make it sensible on CI and with parallel run, so leaving it here for manual testing only
fun testMemory() {
val memoryMXBean = ManagementFactory.getMemoryMXBean()!!
var prevMem = memoryMXBean.getHeapMemoryUsage().getUsed()
for (i in 1..10) {
with(ScriptEngineManager().getEngineByExtension("kts")) {
val res1 = eval("val x = 3")
Assert.assertNull(res1)
val res2 = eval("x + 2")
Assert.assertEquals(5, res2)
}
System.gc()
val curMem = memoryMXBean.getHeapMemoryUsage().getUsed()
if (i > 3 && curMem > prevMem) {
Assert.assertTrue("Memory leak: iter: $i prev: $prevMem, cur: $curMem", (curMem - prevMem) < 1024*1024 )
}
println("${curMem/1024/1024}Mb")
prevMem = curMem
}
}
@Test
fun testIncomplete() {
val engine = ScriptEngineManager().getEngineByExtension("kts")!!
@@ -6,6 +6,7 @@
package kotlin.script.experimental.jvmhost.jsr223
import org.jetbrains.kotlin.cli.common.repl.*
import java.lang.ref.WeakReference
import java.util.concurrent.locks.ReentrantReadWriteLock
import javax.script.ScriptContext
import javax.script.ScriptEngineFactory
@@ -32,8 +33,9 @@ class KotlinJsr223ScriptEngineImpl(
private var lastScriptContext: ScriptContext? = null
val jsr223HostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
val weakThis = WeakReference(this@KotlinJsr223ScriptEngineImpl)
jsr223 {
getScriptContext { lastScriptContext ?: getContext() }
getScriptContext { weakThis.get()?.let { it.lastScriptContext ?: it.getContext() } }
}
}
@@ -37,6 +37,10 @@ class JvmReplCompilerState<CompilationT : JvmReplCompilerState.Compilation>(
}
}
protected fun finalize() {
dispose()
}
fun getCompilationState(scriptCompilationConfiguration: ScriptCompilationConfiguration): CompilationT = lock.write {
if (_compilation == null) {
initializeCompilation(scriptCompilationConfiguration)