Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. 由于查询线程池贯穿整个 iotdb 进程的生命周期,且每个查询线程在读取文件时都会直接申请堆外内存,因此必须对查询线程的数量进行限制。
  2. 限制每次FileChannel的IO数据量,尽管一次可能申请一个大的数据块读取,可以分批读,在内存中拼接返回。
  3. 限制写入和合并生成的 Chunk 大小。
  4. 通过 -Djdk.nio.maxCachedBufferSize 限制缓存的 buffer 大小
  5. 实现工具类,替代 FileChannel虽然 JDK 8u102 之后的版本对 buffer 的最大 size 进行了限制,但是 JDK 的发行说明也提到,这个参数只能解决部分问题,因为该申请的依然会申请,只不过大于阈值的 buffer 会在使用后释放,小于阈值的会被缓存下来。因此在遇到临时申请 buffer 过大,或者小 buffer 缓存数量多的情况,依然会对堆外内存产生较大的压力,因此要从根本上对合并产生的 chunk 大小进行限制,避免因单个 chunk 过大而临时申请堆外内存超出限制的情况。