New candidate JEP: 412: Foreign Function & Memory API (Incubator)

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Fri Apr 23 14:49:51 UTC 2021


Hi
Some of you might wonder as to why the API in this JEP is "still" 
incubating, and what the exit criteria from incubation are. This is, we 
think, a valid point, and one which we'd like to clarify/address a bit here.

First, while it's true that the API has improved considerably over the 
last couple of years, we believe the changes described in this latest 
JEP constitute, to date, the best effort to capture all the moving part 
when it comes to managing off-heap memory. The addition of the new 
ResourceScope/SegmentAllocator abstractions has been instrumental in 
order to address several issues in the previous iterations of the API. 
As with all biggie API changes, there is a source compatibility price to 
pay; I believe this iteration has a much higher chance to break existing 
code written against the Foreign Memory Access API (for one, 
MemorySegment is no longer an AutoCloseable). Because of this, it seemed 
sensible to give them a bit more bake time, rather than declaring it done.

Secondly, there's the issue of VM optimizations; while a lot of work has 
been done in this area, there are still two ways in which the VM support 
for the Foreign Function and Memory API lags behind. Optimization of 
long loops, while improved, still doesn't contain certain bits which are 
crucial to make memory segment access fast [1]. Without those, clients 
are forced to workaround some of the issues, by using `int` (and then 
cast things back to `long`), which is cumbersome and, we feel, way too 
sharp for a "final" API. And, while this iteration vastly improves 
support for upcalls (calling Java from native code), in general the 
linker support is still missing intrinsification support in few 
important cases, such as when arguments are spilled on the stack [2]. 
While this is not rocket science, it's more work that needs to be done, 
so that user can enjoy a predictable performance model, both when 
accessing off-memory, and when calling native functions.

Lastly, while the concept of restricted methods has been present in 
previous JEPs, this JEP is the first one which adds a new launcher 
option for it (--enable-native-access). While the impact on clients 
should be limited (after all, even before some command line option was 
required - e.g. `-Dforeign.restricted=permit`), we feel that this is a 
big enough change to warrant for another round of incubation, to make 
sure that the new option is working as expected. There is also more work 
to be done there, to integrate support for restricted methods in javadoc 
(so that restricted methods are rendered in a special way, similarly to 
preview methods) which we won't be able to fully deliver in 17.

So, while we understand that there might be a desire to move things 
forwards, we felt moving to preview (or finalize the API) at this point 
would have been simply premature.

Cheers
Maurizio


[1] - https://bugs.openjdk.java.net/browse/JDK-8259609
[2] - https://bugs.openjdk.java.net/browse/JDK-8255902


On 22/04/2021 19:27, mark.reinhold at oracle.com wrote:
> https://openjdk.java.net/jeps/412  > > Summary: Introduce an API by which Java programs can interoperate 
 > with code and data outside of the Java runtime. By efficiently > 
invoking foreign functions (i.e., code outside the JVM), and by > safely 
accessing foreign memory (i.e., memory not managed by the > JVM), the 
API enables Java programs to call native libraries and > process native 
data without the brittleness and danger of JNI. > > - Mark


More information about the jdk-dev mailing list