1.预留系统内存:SYSTEM_POOL= Runtime.getRuntime().maxMemory() * 0.4
    2.最大可用内存 maxMemory =
    3.预留内存: RESERVED_POOL = query.max-memory-per-node ,
    4.普通内存: GENERAL_POOL = maxMemory – RESERVED_POOL

    预留系统内存 内存空间 大小 默认
    最大可用内存 SYSTEM_POOL Runtime.getRuntime().maxMemory() * 0.4 系统的buffer内存
    最大可用内存 maxMemory Runtime.getRuntime().maxMemory() – SYSTEM_POOL
    大作业预留内存 RESERVED_POOL query.max-memory-per-node 大作业消耗的内存,默认只允许一个作业运行
    普通内存 GENERAL_POOL maxMemory – RESERVED_POOL 普通作业消耗的内存

    RESERVED_POOL 这块内存触发的条件
    1.GENERAL_POOL 不够用了,有作业block
    2.RESERVED_POOL 还没有被使用
    从集群纬度看
    当满足以下两个条件时候,认为集群的资源不够了,在当前的查询条件下
    1.GENERAL_POOL 出现block
    2.RESERVED_POO被使用了
    对于超出内存有两种方式
    1.查询当前查询是否超出了query.max-memory的大小,若是超过了,那么就kill
    2.如果query.max-memory设置的不合理,非常的大,那么就一直不会触发第一个条件。超过5秒就会进入下一个判断,根据LowMemoryKillerPolicy策略来判断是否杀掉作业. 具体配置是 query.low-memory-killer.policy
    2.1 total-reservation :杀掉集群里面最消耗资源最大的作业
    2.2 total-reservation-on-blocked-nodes : 杀死内存不足节点上,消耗资源最大的作业
    参考资料:
    http://armsword.com/2018/05/22/the-memory-management-and-tuning-experience-of-presto/
    https://prestodb.io/docs/current/release/release-0.191.html
    http://qubole.com/wp-content/uploads/2016/01/PrestoTuning-QuickReferenceGuide.pdf
    https://qubole.zendesk.com/hc/en-us/articles/210266303-How-To-Presto-Tuning