一、什么是垃圾
1、C语言申请内存:malloc free
2、C++:new delete
3、Java:自动内存回收,编程简单,系统不容易出错,手动释放内存容易出现两种类型错误:
1.忘记回收
2.多次回收
没有任何引用指向的一个对象或者多个对象(循环引用)
二、如何寻找垃圾
1、referrnce count :引用计数
2、root searching :根可达算法
根包括哪些:JVM stack,native method stack,runtime constant pool,static reference in method area,clazz
三、常见垃圾回收算法
1、Mark-Sweep:标记清除法,位置不连续,产生碎片
2、Copying:拷贝算法,没有碎片,但是浪费空间
3、Mark-Compact:标记压缩,效率比Copying偏低
四、JVM内存分代模型(用于分代垃圾回收算法)
1、部分垃圾回收器使用的模型
2、新生代+老年代+永久代(1.7) / 元数据区(1.8)metaspace
1.永久代 元数据 -- class
2.永久代必须指定大小限制,元数据区可以设置,也可以不设置,无上限(受限于物理内存)
3.字符串常量:1.7 -- 永久代,1.8 -- 堆
4.方法区(MethodArea)逻辑概念1.7 -- 永久代,1.8 -- 元数据区
3、新生代 = Eden + 2个,新生代用的是Copying的垃圾回收算法
1.ygc之后,大多数对象会被回收,活着的对象进入s0
2.再次ygc,活着 的对象eden+s0 -- > s1
3.再次ygc,eden + s1 -- > s0
4.年龄足够进入老年代(15岁,CMS6)
5.s区转不下直接进入老年代
4、老年代 (用的是Mark Compact的垃圾回收算法)
STW:停顿现象(stop the world)
1.顽固分子
2.老年代满了 FGC (FULL GC)
5、GC Tuning(generation)
1.尽量减少FGC
- 方法区空间增大
- 老年代空间增大
- 新生代空间减小
- 禁止使用System.gc()方法(或者少使用)
- 使用标记-整理算法,尽量让连续空间保持最大
- 排查代码中的无用大对象(内存泄漏)
2.MinorGC = YGC
3.MajorGC = FGC
五、 常见的垃圾回收器
1、Serial: 年轻代 串行回收
2、PS: 年轻代 并行回收
3、ParNew 年轻代 配合CMS 并行回收
4、 SerralOld 老年代 串行回收
5、ParallelOld 老年代 并行回收
6、ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms)
7、G1(10ms)
8、ZGC(1ms)
9、Shenanddaah
10、Eplison (用于debug)
1.8默认的垃圾回收器:PS + ParallelOld
六、常用的命令行参数
java -XX:+PrintFlagsFinal -- 最终参数值
java -XX:+PrintFlagInitial -- 默认参数值
java -XX:+PrintCommandLineFlags -- 启动时默认的命令行参数