JVM(五):JVM模型与GC
- 确定垃圾
- 引用计数(存在循环引用问题)
- 根可达算法
- 常见的垃圾回收算法
- 标记清除算法-位置不连续,产生碎片
- 拷贝算法- 没有碎片,浪费空间
- 标记压缩-没有碎片,效率偏低(多线程需要进行线程同步,单线程效率本来就低)
- JVM内存分代模型(用于分代垃圾回收算法)
a. 部分垃圾回收器使用的模型
b. 新生代+老年代+永久代(1.7)/元数据区(1.8)Metaspace
- 永久代 元数据- Class
- 永久代必须指定大小限制,元数据区可以设置,也可以不设置,无上限(受限与物理内存)
- 字符串常量 1.7在永久代,1.8在堆
- MethodArea(方法区)逻辑概念-指的是永久代或元数据
c. 新生代 = Eden + 2个suvivor区
- YGC回收之后,大多数对象会被回收,活着的进入s0
- 再次YGC,活着的对象eden + s0 ->s1
- 再次YGC,eden+s1->s0
- 年龄足够->老年代
- s区装不下->老年代
d. 老年代
- 顽固分子
- 老年代满了FGC
e. GC Tuning(Generation)
- 尽量减少FGC
- MinorGC = YGC
- MajorGC = FGC
- 常见的垃圾回收器
a. Serial-年轻代 串行回收
b. PS-年轻代 并行回收
c. ParNew-年轻代 配合CMS的并行回收(PS和CMS不能配合使用,为了配合CMS,产生了ParNew)
d. SerialOld
e. ParallelOld
f. ConcurrentMarkSweep 老年代,垃圾回收和引用程序同时进行,降低STW的时间(200ms)
j. G1(10ms)
h. ZGC(1ms) PK C++
i. Shenandoah
g. Eplison
1.8默认的垃圾回收器: PS+ParallelOld
- JVM调优
- JVM命令行参数参考: 命令行
- 常用:
- -XX:+PrintFlagsFinal (打印所有最终生效值)
- -XX:+PrintFlagsInitial (打印默认值)
- -XX:+PrintCommandLineFlags (启动时的命令行参数)
- JVM参数分类
- 标准:-开头,所有的HotSpot都支持
- 非标准: -X开头,特定版本HotSpot支持特定命令
- 不稳定: -XX开头,下个版本可能取消