Remove sun.misc.Unsafe memory access API usage
- JDK 24 logs warnings to console on misc.Unsafe mem access API use,
- "JDK 26 or later" will set
--sun-misc-unsafe-memory-accesstodeny - last phase removes the methods
see JEP 498.
nb 25 started on JDK 24 in terminal will print the following to console:
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper (jar:file:/home/mbien/dev/nb/java/maven/lib/guava-33.2.1-jre.jar!/)
WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
to get the full stack trace, set --sun-misc-unsafe-memory-access=debug
(but there might be more usages, guava might have it fixed in the next release https://github.com/google/guava/issues/6806#issuecomment-2590312869) edit: guava and guice is resolved
guava removed their misc.Unsafe usage https://github.com/apache/netbeans/pull/8376
this looks like the 3.6 lucene editor dependency ( ./ide/libs.lucene/external/binaries-list) since RamUsageEstimator doesn't use Unsafe anymore.
jfr print --events jdk.DeprecatedInvocation nb_startup_1.jfr
...
jdk.DeprecatedInvocation {
startTime = 20:11:36.151 (2025-03-31)
method = sun.misc.Unsafe.objectFieldOffset(Field)
invocationTime = 20:10:47.191 (2025-03-31)
forRemoval = true
stackTrace = [
org.apache.lucene.util.RamUsageEstimator.<clinit>() line: 191
...
]
}
the other two should be fixed via regular maven updates
# lucene 3.6
sun/misc/Unsafe#addressSize org.apache.lucene.util.Constants.<clinit>(Line:79)
sun/misc/Unsafe#arrayBaseOffset org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:210)
sun/misc/Unsafe#arrayIndexScale org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:171)
sun/misc/Unsafe#objectFieldOffset org.apache.lucene.util.RamUsageEstimator.<clinit>(Line:191)
# guava again
sun/misc/Unsafe#compareAndSwapObject com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.casValue(Line:1430)
sun/misc/Unsafe#getAndSetObject com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.gasListeners(Line:1418)
sun/misc/Unsafe#getAndSetObject com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.gasWaiters(Line:1424)
sun/misc/Unsafe#objectFieldOffset com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.<clinit>(Line:1381)
# guice
sun/misc/Unsafe#getObject com.google.inject.internal.aop.HiddenClassDefiner.define(Line:62)
sun/misc/Unsafe#staticFieldBase com.google.inject.internal.aop.HiddenClassDefiner.<clinit>(Line:46)
sun/misc/Unsafe#staticFieldOffset com.google.inject.internal.aop.HiddenClassDefiner.<clinit>(Line:48)
guice usages can be fixed by setting -J-Dguice_custom_class_loading=CHILD -> https://github.com/apache/netbeans/pull/9021
truffle has also unsafe usage. post java cluster activation:
WARNING: sun.misc.Unsafe::objectFieldOffset called by com.oracle.truffle.api.dsl.InlineSupport$UnsafeField (jar:file:/home/mbien/dev/netbeans_28/ide/modules/ext/truffle-api-24.0.0.jar!/)
at com.oracle.truffle.api.dsl.InlineSupport$UnsafeField.<init>(InlineSupport.java:1162)
at com.oracle.truffle.api.dsl.InlineSupport$InlinableField.<init>(InlineSupport.java:359)
at com.oracle.truffle.api.dsl.InlineSupport$ReferenceField.<init>(InlineSupport.java:519)
at com.oracle.truffle.api.dsl.InlineSupport$ReferenceField.create(InlineSupport.java:597)
at com.oracle.truffle.api.strings.TruffleStringFactory$FromJavaStringNodeGen.<clinit>(TruffleStringFactory.java:801)
at com.oracle.truffle.api.strings.TruffleString$FromJavaStringNode.getUncached(TruffleString.java:2090)
at com.oracle.truffle.api.strings.TruffleString.fromJavaStringUncached(TruffleString.java:2104)
at com.oracle.truffle.polyglot.PolyglotValueDispatch.createDefaultValues(PolyglotValueDispatch.java:1704)
at com.oracle.truffle.polyglot.PolyglotImpl.initialize(PolyglotImpl.java:203)
at org.graalvm.polyglot.Engine.loadAndValidateProviders(Engine.java:1706)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1732)
at org.graalvm.polyglot.Engine$1.run(Engine.java:1727)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:74)
at org.graalvm.polyglot.Engine.initEngineImpl(Engine.java:1727)
at org.graalvm.polyglot.Engine$ImplHolder.<clinit>(Engine.java:190)
at org.graalvm.polyglot.Engine.getImpl(Engine.java:442)
at org.graalvm.polyglot.Engine$Builder.build(Engine.java:740)
at org.netbeans.libs.graalsdk.impl.GraalEnginesProvider.lambda$enumerateLanguages$1(GraalEnginesProvider.java:162)
at org.netbeans.libs.graalsdk.impl.GraalContext.executeWithClassLoader(GraalContext.java:117)
at org.netbeans.libs.graalsdk.impl.GraalEnginesProvider.enumerateLanguages(GraalEnginesProvider.java:161)
at org.netbeans.libs.graalsdk.impl.GraalEnginesProvider.factories(GraalEnginesProvider.java:66)
at org.netbeans.api.scripting.Scripting$EngineManager.populateExtras(Scripting.java:159)
at org.netbeans.api.scripting.Scripting$EngineManager.<init>(Scripting.java:139)
at org.netbeans.api.scripting.Scripting.build(Scripting.java:126)
at org.netbeans.api.scripting.Scripting.createManager(Scripting.java:71)
at org.netbeans.modules.templates.ScriptingCreateFromTemplateHandler.getEngine(ScriptingCreateFromTemplateHandler.java:150)
at org.netbeans.modules.templates.ScriptingCreateFromTemplateHandler.engine(ScriptingCreateFromTemplateHandler.java:162)
at org.netbeans.api.templates.CreateFromTemplateImpl.computeEffectiveName(CreateFromTemplateImpl.java:211)
at org.netbeans.api.templates.CreateFromTemplateImpl.collectAttributes(CreateFromTemplateImpl.java:94)
at org.netbeans.api.templates.FileBuilder.createDescriptor(FileBuilder.java:291)