Skip to content

Commit 6dc5a5d

Browse files
committed
Support -XX:+UseCompactObjectHeaders
1 parent c8027ee commit 6dc5a5d

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

core/src/main/kotlin/io/github/rothes/esu/core/util/UnsafeUtils.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.github.rothes.esu.core.util.ReflectionUtils.accessibleGet
44
import io.github.rothes.esu.core.util.ReflectionUtils.handle
55
import sun.misc.Unsafe
66
import java.lang.invoke.MethodHandle
7+
import java.lang.management.ManagementFactory
78
import java.lang.reflect.Field
89
import java.lang.reflect.Modifier
910

@@ -18,10 +19,12 @@ object UnsafeUtils {
1819

1920
init {
2021
val internalOffsetMethod = internalUnsafe.javaClass.getDeclaredMethod("objectFieldOffset", Field::class.java)
21-
val bool = unsafe.getBoolean(internalOffsetMethod, 12)
22-
unsafe.putBoolean(internalOffsetMethod, 12, true) // Make it accessible
22+
val newHeader = Runtime.version().version().first() >= 24 && ManagementFactory.getRuntimeMXBean().inputArguments.any { it == "-XX:+UseCompactObjectHeaders" }
23+
val accessibleOffset = if (newHeader) 8L else 12L
24+
val bool = unsafe.getBoolean(internalOffsetMethod, accessibleOffset)
25+
unsafe.putBoolean(internalOffsetMethod, accessibleOffset, true) // Make it accessible
2326
internalOffset = internalOffsetMethod.handle(pType = Any::class.java) // This checks for accessible when we get it
24-
unsafe.putBoolean(internalOffsetMethod, 12, bool) // Set accessible back, we no longer need the hack
27+
unsafe.putBoolean(internalOffsetMethod, accessibleOffset, bool) // Set accessible back, we no longer need the hack
2528
}
2629

2730
fun <T> Field.usGet(obj: Any?): T {

0 commit comments

Comments
 (0)