如果(a)峰值应用程序性能是第一要务,并且(b)没有暂停时间要求或可接受一秒或更长
时间的暂停,则让VM选择收集器或使用-XX:+ UseParallelGC选择并行收集器 。
如果响应时间比整体吞吐量更重要,并且垃圾收集暂停时间必须保持在大约一秒钟以内,则选
择具有-XX:+ UseG1GC。(值得注意的是JDK9中CMS已经被Deprecated,不可使用!移除
该选项)
如果使用的是jdk8,并且堆内存达到了16G,那么推荐使用G1收集器,来控制每次垃圾收集
的时间。
如果响应时间是高优先级,或使用的堆非常大,请使用-XX:UseZGC选择完全并发的收集
器。(值得注意的是JDK11开始可以启动ZGC,但是此时ZGC具有实验性质,在JDK15中
[202009发布]才取消实验性质的标签,可以直接显示启用,但是JDK15默认GC仍然是G1)
这些准则仅提供选择收集器的起点,因为性能取决于堆的大小,应用程序维护的实时数据量以及可用处
理器的数量和速度。
如果推荐的收集器没有达到所需的性能,则首先尝试调整堆和新生代大小以达到所需的目标。 如果性能
仍然不足,尝试使用其他收集器
总体原则:减少STOP THE WORD时间,使用并发收集器(比如CMS+ParNew,G1)来减少暂停时间,
加快响应时间,并使用并行收集器来增加多处理器硬件上的总体吞吐量。
7. 简述一下Java类加载模型?
双亲委派模型
在某个类加载器加载class文件时,它首先委托父加载器去加载这个类,依次传递到顶层类加载器
(Bootstrap)。如果顶层加载不了(它的搜索范围中找不到此类),子加载器才会尝试加载这个类。
双亲委派的好处
每一个类都只会被加载一次,避免了重复加载
每一个类都会被尽可能的加载(从引导类加载器往下,每个加载器都可能会根据优先次序尝试
加载它)