1. 内存池初始化
初始化代码在LocalMemoryManager中,启动时将内存分为3个内存池,分别是:
- RESERVED_POOL:预留内存池,用于执行最耗费内存资源的查询。
- GENERAL_POOL:普通内存池,用于执行除最耗费内存查询以外的查询。
- SYSTEM_POOL:系统内存池,预留的用于Presto内部数据结构和临时的分配需求使用的内存。
long maxHeap = Runtime.getRuntime().maxMemory();
//堆内存最大值,由Xmx指定
maxMemory = new DataSize(maxHeap - systemMemoryConfig.getReservedSystemMemory().toBytes(), BYTE);
//扣除系统内存池的剩余最大内存
builder.put(RESERVED_POOL, new MemoryPool(RESERVED_POOL, config.getMaxQueryMemoryPerNode()));
//RESERVED_POOL的大小由MaxQueryMemoryPerNode指定
DataSize generalPoolSize = new DataSize(Math.max(0, maxMemory.toBytes() - config.getMaxQueryMemoryPerNode()