1

Javaで長いメモリアドレスを持っていたとしましょう。メモリアドレスが関数ポインタであることがわかっている場合、このアドレスで関数を呼び出すにはどうすればよいですか?

私がこれに興味を持っている理由は、オフヒープ オブジェクトを扱うためです。GC の対象とならないダイレクト バイト バッファにオブジェクトを作成します。これにより、ヒープ上にオブジェクトを作成しないと GC が実行されないため、GC の一時停止時間を無効にすることができます。

4

1 に答える 1

2

純粋な Java 内ではそうはなりません。これは、Java の多くとは正反対です。本当にしたい場合は、 JNIを使用して行うことができます。理想的には、これを行う必要がないように設計を変更しますが、これはほとんどの状況でかなり奇妙な要件です。

投稿を編集したので、基本的には VM のガベージ コレクターよりも優れた機能を使用したいと考えているようです。これを避けることを強くお勧めします。多大な労力がかかり、環境ごとに異なるバイナリを必要とする非常に脆弱なシステムにつながる可能性があります。とにかく、オフヒープ値を実際のオブジェクトとして使用するのは難しいでしょう。その時点で、JVM はデータについてさまざまな仮定を行う可能性があるからです。プリミティブ値のみを気にする場合は、その配列内のデータとプリミティブ値の間で変換するための適切なラッパー コードを使用して、「生の」ストレージとして機能する大きなバイト配列を常に持つことができます... すべて JNI なしで。

于 2013-10-18T15:36:15.937 に答える