Modern Java Features
Foreign Function & Memory API
Interact with native memory off-heap and invoke C libraries safely using the Foreign Function & Memory API (Java 22).
Interview: Compares FFM API to JNI, and details off-heap memory safety (Arena and Segment Allocators).
Introduced in Java 22, the Foreign Function & Memory (FFM) API allows Java programs to call native code (C/C++) and allocate off-heap memory safely and efficiently, replacing JNI.
Core Idea
FFM provides access to off-heap memory and native code without JNI compilation boilerplate.
Why It Matters
Enables high-performance integration with databases (like RocksDB) or ML runtimes (like TensorFlow) with minimal overhead.
Interview Lens
Tests Arena lifecycles, Segment Allocators, and comparing FFM safety to raw C pointers.
Core FFM Concepts
MemorySegment: Represents a contiguous region of memory (on-heap or off-heap).Arena: Controls the lifecycle of allocated off-heap memory. Confined Arenas ensure memory is freed when exiting a block.Linker: Resolves native function descriptors and links Java method handles to C library symbols.
Code Walkthrough
This program allocates off-heap memory using an Arena and writes a string value to it.
Interview-Relevant Information
Q: Why is FFM preferred over JNI?
Answer: JNI requires writing native C stub code, header files, and compiling shared libraries, making development complex. FFM allows developers to link C libraries directly in Java using method descriptors, bypassing stub compilation. It also provides memory safety bounds checking, preventing JVM crashes from bad pointer reads.
Quick Checklist
What is the purpose of an Arena? Why is FFM safer than native JNI coding? If yes, you understand FFM basics.
Use Cases
Integrating off-heap memory caches to avoid garbage collection overhead in high-throughput databases.
Accessing OS-level kernel operations via direct DLL calls.
Common Mistakes
Attempting to access a MemorySegment after its parent Arena has closed, throwing IllegalStateException.
Not handling memory alignments correctly during raw struct allocation.