2026年7月23日(木)掲載 2,900本日 30
HN10123

Javaのレコードをネイティブメモリへ爆速マッピング!新ライブラリのご紹介

Library for fast mapping of Java records to native memory

joe_mwangi2か月前

議論

9
0joe_mwangiスレ主1012か月前

Javaのレコード(records)をネイティブメモリに高速かつ効率的にマッピングするためのライブラリです。パフォーマンスを極限まで追求したい開発者の方に最適なソリューションです。

1wood_spirit2か月前

これは興味深いね。Javaには、高パフォーマンスなアリーナ上で型安全なシュガーとして機能するstructの配列がどうしても必要だけど、これを使おうとするような局面ってゼロアロケーションを目指すような場所でしょ。このライブラリのオフヒープのコストや、getter/setterでのオブジェクトアロケーションを考えると、多くのユースケースでメリットが打ち消されてしまいそう。

2kosolam2か月前

いいね。APIがすごくすっきりしてる。

3usernametaken292か月前

なんでGraalを使わないの?

4matt_heimer2か月前

これの立ち位置は何で、どう動くものなの?SBEとの比較があると嬉しいかも。

LayoutやMemorySegmentを使うのが冗長だという問題はわかるけど、自分がそれらを使っているのは、オフヒープメモリを利用してオブジェクトのアロケーションを回避するような、パフォーマンス重視のソフトウェアを開発するためなんだよね。

「Javaのrecord型をネイティブメモリにマッピングする」って具体的にどういう意味?Javaのrecordを何らかの方法でフライウェイトに変換しているのか、それとも Point point = points.get(0); はオフヒープメモリから読み取ったデータを使ってrecordのインスタンスを生成しているだけなのか?もしリフレクションを使った動的なマッピングライブラリだとしたらクールだけど、それだと多くのJavaオフヒープ利用におけるパフォーマンス目標を台無しにしてしまわないかな?

これは、パフォーマンスがそれほど重要じゃない場面で、データを通常のJavaヒープ領域に引き出すためのオフヒープからヒープへのブリッジという扱いなの?

5jayd162か月前

パッと見、C#のSpan<T>を思い出すな。

6steve_barham2か月前

数年前に似たようなことをやったことがあるよ。宣言へのアプローチを少し変えて、インターフェースを使ってstructのレイアウトを定義するようにしたんだ。ミューテーションは(当時の)標準的なJavaBeansのレイアウトを使ってsetterを公開することでオプトインにして、アノテーションプロセッサが実装クラスのコード生成を担当する仕組み。これを使えば、オフヒープ構造体のヒープ内ボックスが必要な場所で利用できた。

このアプローチの利点の一つは、インターフェースを型として使うことでフライウェイトパターンをかなり簡単にサポートでき、大規模なオフヒープコレクションを扱う際のGC負荷を減らせることだった。ステートレスなインターフェースとオフヒープ構造体の類似性も、なかなかいい感じだったよ。

Unsafeなどよりもモダンな技術を使って、似たような試みをもっと見てみたいね。

7c-fe2か月前

これってSBEのエンコーダー/デコーダーが生のメモリに対して行うフライウェイトとかなり似てないか?違いは何?

8wwarner2か月前

Apache Arrowでも同じ目的を果たせないのかな?