Foreign-Memory Access API = API dostępu do cudzej pamięci.
Podstawa: https://openjdk.java.net/jeps/370
Foreign-memory oznacza tutaj pamięć poza stertą Java.
Język Java pozwalał na alokowanie pamięci poza stertą Java (java.nio.ByteBuffer
, sun.misc.Unsafe
).
Celem było stworzenie API konkurującego wydajnoscią i bezpieczeństwem z wyżej wymienionymi rozwiązaniami.
Dostęp do zewnętrznej pamięci pozwala na:
- uniknięcie narzutów nieprzewidywalności zbieraczy śmieci (garbage collector), szczególnie przy obsłudze dużych buforów
- współdzielenie pamięci przez wiele procesów
- serializację i deserializację zawartości pamięci przez mapowanie plików na pamięć
Nowe API:
- pozwala operować na różnych rodzajach pamięci jak natywna (native), utrwalona (persistent) czy zarządzana pamięć sterty (managed heap memory)
- jest bezpieczne dla JVM
- zapewnia determinizm poprzez jawność alokacji w kodzie
- omija ograniczenia bezpośredniej alokacji pamięci w
ByteBuffer
(ograniczenie do 2 GB, ze względu na używanie indeksowania opartego na intach, kłopoty z uwalnianiem wykorzystywanej pamięci) - omija kłopoty z bezpieczeństwem związane z użyciem
sun.misc.Unsafe
API znajduje się w w module i pakiecie jdk.incubator.foreign
.
Podstawą API są interfejsy: MemorySegment
, MemoryAddress
, MemoryLayout
oraz klasy: MemoryHandles
, MemoryLayouts
, GroupLayout
, SequenceLayout
, ValueLayout
.
(Wystarczające) przykłady użycia znajdują się W JEP-370 i dokumentacji Oracle.