Hi,

 

Why do you need the address at all in the Java code? Java code can use the 
official ByteBuffer methods to access the memory you are wrapping. In Java 9 
that’s optimized very good by Hotspot and should be almost as fast as array 
accesses (we proved that in Apache Lucene - congrats to the Hotspot 
committers). If you need special access modes like volatile access, then you 
can use Java 9's VarHandles. You can get a VarHandle to the backing direct 
buffer using the MethodHandles API.

I mentioned this upthread - the base address is used for index calculations to 
read/write data using Unsafe directly.  I don't know about Java 9 as I've not 
tried it yet, but the generated assembly for using BB methods vs Unsafe did not 
favor BB.  There are also various safety checks in DBB/Buffer internals that 
won't get optimized away.  

 

Also, my general experience with looking at C2 optimizations has led me to the 
conclusion that the optimizations are "unstable" - innocent code changes, 
differences in order of how classes are loaded, differences in what callsites 
trigger compilation first, and a bunch of other otherwise benign things can 
interfere with inlining decisions, which is typically the reason things go 
sideways in terms of optimization.

 

As for MethodHandles and VarHandles, that's one possibility I'm considering as 
a way to migrate off using DirectBuffer (although I'd still like to know if 
there's any plan to standardize/formalize some notion of a direct buffer).  
However, my understanding is that using MH will still require me to crack into 
jdk code (to get access to the DBB and friends) and thus require addExports.  
DirectBuffer is still accessible if using addExports, but it's a wrinkle I was 
hoping to iron out, hence what started this email chain. 

 

with VarHandles you can directly access the underlying native memory. You can 
get a ByteBufferView varhandle - no cracks and Unsafe needed:

< 
<http://download.java.net/java/jdk9/docs/api/java/lang/invoke/MethodHandles.html#byteBufferViewVarHandle-java.lang.Class-java.nio.ByteOrder->
 
http://download.java.net/java/jdk9/docs/api/java/lang/invoke/MethodHandles.html#byteBufferViewVarHandle-java.lang.Class-java.nio.ByteOrder->

 

Uwe

Reply via email to