1. 优先调整堆的大小让服务器自己来选择
    2. 如果内存小于100M,使用串行收集器
    3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
    4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
    5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
    6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC

    下图有连线的可以搭配使用
    clipboard.png
    JDK 1.8默认使用 Parallel(年轻代和老年代都是)
    JDK 1.9默认使用 G1
    安全点与安全区域
    安全点就是指代码中一些特定的位置,当线程运行到这些位置时它的状态是确定的,这样JVM就可以安全的进行一些操作,比如GC等,所以GC不是想什么时候做就立即触发的,是需要等待所有线程运行到安全点后才能触发。
    这些特定的安全点位置主要有以下几种:

    1. 方法返回之前
    2. 调用某个方法之后
    3. 抛出异常的位置
    4. 循环的末尾

    大体实现思想是当垃圾收集需要中断线程的时候, 不直接对线程操作, 仅仅简单地设置一个标志位, 各个线程执行过程时会不停地主动去轮询这个标志, 一旦发现中断标志为真时就自己在最近的安全点上主动中断挂起。 轮询标志的地方和安全点是重合的。

    安全区域又是什么?
    Safe Point 是对正在执行的线程设定的。
    如果一个线程处于 Sleep 或中断状态,它就不能响应 JVM 的中断请求,再运行到 Safe Point 上。
    因此 JVM 引入了 Safe Region。
    Safe Region 是指在一段代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的。