netbeans icon indicating copy to clipboard operation
netbeans copied to clipboard

Remove sun.misc.Unsafe memory access API usage

Open mbien opened this issue 10 months ago • 3 comments

  • JDK 24 logs warnings to console on misc.Unsafe mem access API use,
  • "JDK 26 or later" will set --sun-misc-unsafe-memory-access to deny
  • 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

mbien avatar Feb 18 '25 21:02 mbien

guava removed their misc.Unsafe usage https://github.com/apache/netbeans/pull/8376

mbien avatar Mar 31 '25 20:03 mbien

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)

mbien avatar Mar 31 '25 20:03 mbien

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)

mbien avatar Nov 16 '25 07:11 mbien