2017-02-01 2 views
0

これはすべてのエントリが削除されなかった理由を見つけることができなかったので、これは愚かな間違いのようです。私はJAVA_OPTSを実行しています:Netty PooledDirect ByteBufとArrayListの予期しない動作

-XX:MaxDirectMemorySize = 67108864 -Dio.netty.leakDetectionLevel =先進-D-Dio.netty.allocator.type =プールされた-XX:+ UseG1GC -Xms40m -Xmx40m -Dio。ここでnetty.allocator.numDirectArenas = 4

完全なコードです:

private ByteBufAllocator alloc = PooledByteBufAllocator.DEFAULT; 

//Configure the arena 
//java -Dio.netty.allocator.numDirectArenas=... -Dio.netty.allocator.numHeapArenas=... 
public ByteBuf createObject(int size){ 
    return alloc.directBuffer(size); 
} 

public static void main(String[] args) throws InterruptedException { 
    ArrayList<ByteBuf> arr = new ArrayList<>(); 
    try { 
     DiameterLoggingConfiguration.initLogger(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    ByufferTest bt = new ByufferTest(); 
    //Total of 66060288 ~ slightly less than 64 mb of direct memory 
    for(int i=0;i<64512;i++){ 
     //Each instance of 1024 bytes 
     arr.add(bt.createObject(1024)); 

    } 

    BufferedReader br = new BufferedReader(new 
       InputStreamReader(System.in)); 
    try { 
     br.readLine(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Now releasing.."+arr.size()); 

    for(int i=0;i<arr.size();i++){ 
     ByteBuf b = arr.remove(i); 
     b.release(); 
    } 

    System.out.println("Now array size ="+arr.size()); 

    Thread.sleep(100000); 

} 

出力は次のとおりです。

リリース.64512 アレイサイズ後= 32256

エントリのちょうど半分が削除されました。それでも、ArrayListにはByteBufエントリがあります。あなたが使用しているため

答えて

1

ザッツ:

for(int i=0;i<arr.size();i++){ 
    ByteBuf b = arr.remove(i); 
    b.release(); 
} 

これはあなたが0で、インデックスをインクリメントするだけでなく、バ​​ッファを削除するようがない作品。この方法でバッファをスキップします。

Queueを使用してください。poll()を使用してください。

Queue<ByteBuf> arr = new ArrayDeque<>(); 
for(;;){ 
    ByteBuf b = arr.poll(); 
    if (b == null) { 
     break; 
    } 
    b.release(); 
} 
+0

本当にうまくいきます。たくさんの@Norman – GauravTheGeek