2009-07-11 7 views
3

バイト配列をjavaに固定する方法はありますか?移動/圧縮されることはありませんか?Javaでバイト配列を固定するにはどうすればよいですか?

私は、実行時にGCをゼロにすることを目的としたアプリケーションに取り組んでおり、メモリマップ領域に固定されているプリミティブなバイト配列を使用したいと考えています。これを行う方法やそれに邪魔する方法はありますか?

+0

私は質問することができます:なぜですか?アプリケーションにGCを必要としない理由と、なぜアレイを固定したいのですか? – Mnementh

+0

私は自分のプロセスにRDMAを統合しようとしており、最高のパフォーマンスを実現したいと考えています。 私のアプリケーションは非常にレイテンシに敏感で、3msの間でさえも休止してはいけないので、私のアプリケーションにはGCは必要ありません。 バイト配列が固定され、直接バイトバッファではなく、バイト配列アクセスのパフォーマンスがバイトバッファよりもはるかに優れているためです。 –

答えて

5

本当にゼロガベージコレクションですか?本当に?

もしそうなら、私は2つのオプションのいずれかを示唆している:

  1. real-time JVMを使用します。一般的なアプリケーションをソフトからハードリアルタイムシステムに分離するほぼすべてを管理するためのオプションがあります。
  2. 特定の実行中に必要なメモリよりもはるかに多くのメモリを割り当てることについて真剣に考えてください。これは洗練された解決策ではありませんが、メモリを利用できる場合は、コアフットプリントで必要と思われる量よりも10倍多く割り当てることをお勧めします。それはちょうどうまくいくかもしれません、あなたは認めなければなりません、RAMはソフトウェアエンジニアリング労働よりも安いです。ずっと後

EDIT:

ちょうどあなたが静的にバイト配列を割り当てることを検討すべきであると私に起こりました。すなわち、このような何か:

/** Byte arrays that you absolutely have to keep. */ 
public class KeepForever { 
    /** Note that I make no claims about thread safety in this simple example. */ 
    public static byte [] keepMe = new byte[100]; 
}; 

// Much later in example code .... 

/** This should always succeed. No worries about garbage collection. */ 
public void setMe(int index, byte newByte) { 
    // Admittedly, this defeats several principles of OOD but it makes 
    // the point about the syntax. 
    KeepForever.keepMe[index] = newByte; 
} 
+0

ガベージコレクションはまったくゼロです。私のアプリケーションは、起動時にすべてを割り当て、これ以上の割り当ては行いません。しかし、私は、JVMがGCを実行せず、ヒープを圧縮しないという割り当て保証をしていないと思います。これは私の懸念です。 リアルタイムのJVMを使用したくないのは、一貫性のある中規模の待ち時間と平均スループットとは対照的に、高いスループットと低い待ち時間が必要なためです。 –

+1

配列を事前に割り当ててもガベージコレクション中に移動するのを止めることはできません(他の何かがGCをトリガしていると仮定します)。 – finnw

0

それはまだ参照可能だオブジェクトがGC'dされることはありません、ダイレクトメモリマッピングに関連していないですが。参照が生きている場所は何でも良いはずです。

+0

ジェネレーションGCでは、メモリ内で移動されます。 – Mnementh

6

ByteBuffer/allocateDirect()これは、 "c"スペースにあり、ヒープを使用しないので、移動されず、JNI呼び出しで効率的に使用できるバイトバッファを作成します。

+0

バイトバッファはバイト配列よりパフォーマンスが劣るので、私はそれらを使用することを避けようとしています。 –

+2

本当ですか?そして、私はByteBufferの全ポイントがパフォーマンスを向上させることだと思った(少なくとも特定の操作の場合);)あなたはこの機能が必要なのでしょうか。 –

+1

ピーターは正直であり、直接的なNIOバッファは、通常は移動されず、JNI呼び出しに適しているため、多数のJavaバインディングで使用されます。 – gouessej

関連する問題