我在多个线程不断处理2G以上的文件时候 应用文件映射内存的方式来读取文件【只有读取操作无写操作】
没个线程在处理一个文件的时候大概是这样的过程1.每次映射6M到内存,读取完6M后循环 再读取后面6M这样循环知道读完文件
大概是这样一个过程代码没贴出,简单写下。MappedByteBuffer buffer =nullfor(int i=0; i<1000;i++){
   start + 6000000;
   buffer = fileChannel.map (FileChannel.MapMode.READ_ONLY, strat, 6000000);
   read(buffer);
   buffer.clear()}这就出个问题,我发现内存会不够用,貌似每次的buffer都是新建一个,而旧的并没有清空。而每次循环玩一次我都调用了
buffer.clear()高手分析下问题出在哪? 在线等

解决方案 »

  1.   

    感觉不像是FileChannel本身的问题,怀疑是你read函数里面的问题。如果上述推论属实,那么你把 read(buffer); 这行注释掉,你的程序应该就不会内存溢出了吧?
      

  2.   

    我想说的map()这函数  每次都去映射一块内存 怎么去释放?
    还是可以让每次映射都在同一块内存上 覆盖上面的数据
      

  3.   

    clear就释放了,JVM到时间就会回收。除非你另外做了引用。如果你确实想要重用ByteBuffer这个对象,应该用read(ByteBuffer dst); 
    不过我还是觉得问题不是出在FileChannel的操作上,应该是read函数中的操作要么申请了过多内容,要么引用了buffer对象,导致JVM做GC的时候不能将其回收。