Skip to content

[S1.1b] P2: JVM/Android Storage.OffHeap (FFM MemorySegment / direct ByteBuffer) and Storage.Mapped (FileChannel.map) #1019

Closed

Description

@michalharakal

Sub-issue of #1002 · Phase P2 · Milestone M1 · PRD: M1-F1 · Proposal: §4.8.1, §4.8.2
Branch: feature/1019-storage-jvm-offheap-mapped

Design docs: docs/design/memory/memory-architecture-proposal.md (proposal rev. 2, §-numbers below refer to it) and docs/design/memory/memory-architecture-milestones-prd.md (PRD, requirement IDs Mx-Fy/Mx-Ay) — both land with the SKEEP-003 docs PR; until merged they are attached to #932.

Task

  • jvmMain: OffHeap over MemorySegment in a java.lang.foreign.Arena (direct ByteBuffer fallback where FFM is unavailable), Mapped over FileChannel.map → MemorySegment; Owner.Borrowed = MemorySegment.ofArray/ofBuffer; asHeapArray()/segment() fast-path accessors; existing MmapTensorData/MappedGgufWeights get a Storage.Mapped constructor path. androidMain: direct ByteBuffer + MappedByteBuffer bindings.

Acceptance

MemSegArenaLeakTest-style leak test; mapped read parity vs MappedGgufWeights; Android host tests.

Depends on

#1018 (S1.1a).

Keeps develop green by

Platform bindings only; nothing default-switched.

Working rules (every slice)

  • One slice = one branch feature/1019-<slug> from develop = one PR (Closes #1019), merged independently.
  • develop stays usable after merge: additive API or behind façade / opt-in; no default behaviour switch without golden-parity + benchmark evidence in the PR; deprecate with ReplaceWith, never delete before a major (zero-consumer dead code may be removed with evidence in the PR). No new abstract members on TensorData/KernelProvider (defaults only); no data-class primary-constructor changes (secondary ctors only); BCV: apiDump both api/jvm and api/android, apiCheck clean.
  • Test gate before the PR (JDK 25, scripts/pr-gate.sh once it exists): ./gradlew jvmTest linuxX64Test assemble, ./gradlew verifyNpmPins jsTest wasmJsTest wasmWasiTest, ./gradlew apiCheck, ./gradlew :skainet-test:skainet-test-java:test; storage/backend slices add :skainet-lang:skainet-lang-core:jvmBenchmark and :skainet-backends:benchmarks:jvm-cpu-jmh:jmh before/after when a hot path changes.
  • Commits: conventional commit subject, Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> trailer. Do not edit CHANGELOG.md in slice PRs (parallel branches conflict on it; release notes are written at release time from the merged PRs).

Metadata

Metadata

Assignees

No one assigned

    Labels

    codingImplementation task (DARC: C)platformPlatform support (WASM, JVM, native)sub-issueSub-issue of a tracking issuetensorsTensor operations and data structures

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions