protected void reloadChunk(final ChunkPosition pos) {
    boolean end = false;
    do {
      try {
        checkHeapStatus();
        final File f;
        synchronized(reload) {
          f = reload.get(pos);
        }
        if(f == null) return;
        final ChunkInFilePosition op;
        synchronized(otherPos) {
          op = otherPos.get(pos);
        }
        final MapReader r = MapReader.getForFile(f);
        final Chunk chunk = new Chunk(r.read(op), f, op);
        synchronized(chunks) {
          chunks.put(pos, chunk);
        }
        synchronized(reload) {
          reload.remove(pos);
        }
        synchronized(otherPos) {
          otherPos.remove(pos);
        }
        end = true;
      } catch(final OutOfMemoryError e) {
        boolean canUnload;
        synchronized(mayUnload) {
          canUnload = !mayUnload.isEmpty();
        }
        if(canUnload) {
          beFriendly = false;
          user.memoryPanic();
        } else if(e == OWN_MEM) {
          beFriendly = true;
        } else throw new Error(e);
      }
    } while(!end);
  }