什么是垃圾
一个或多个对象没有任何引用指向它,这个(这些)对象就是需要回收的垃圾
如何定位垃圾
>引用计数算法(无法解决循环引用)
>根可达算法(根搜索算法):
根对象包含:线程栈变量,静态变量,常量池,JNI指针
常见的垃圾回收算法
> Mark-Sweep(标记清除): 回收后位置不连续,产生碎片
> Copying(拷贝): 没有碎片,但是浪费空间
> Mark-Compact(标记压缩):没有碎片,由于会对内存空间进行整理,相比于其他2种算法效率偏低
JVM内存分代模型(用于分代垃圾回收算法)
> 部分垃圾回收器使用的模型
> 年轻代 + 老年代 +【永久代(1.7)/元数据区(1.8,MeataSpace)】
> 永久代/元数据区存储class
> 永久代必须指定大小限制,元数据没有限制(受限于物理内存)
> 字符串常量: 1.7-永久代,1.8-堆
> 方法区(MethodArea)是逻辑概念: 1.7:永久代, 1.8:元数据区
> 年轻代: Eden + s0 + s1,YGC/YOUNG GC/Minor GC > YGC回收之后大多数对象会被回收,活着进入Survivor区
> 首次YGC: Eden -> S0
> 再次YGC:Eden + s0 -> s1
> 再次YGC:Eden + s1 -> s0
> 再次YGC:Eden + s0 -> s1 ,......循环往复 > 年龄足够/Survivor区装不下 -> 老年代> 老年代
> 顽固分子
> 老年代满了 FGC/FULL GC/Major GC
> GC Tuning(Generation): 尽量减少Full GC
常见的垃圾回收器
分代垃圾回收器-年轻代
Serial: a stop-the-world,copying collector which uses a single GC thread[stw,串行,拷贝算法]
ParallelScavenge: a stop-the-world,copying collector which uses multiple GC threads
[stw,并行,拷贝算法]ParNew: a stop-the-world,copying collector which uses a single GC threads
It differs from "parallel scavenge" in that
it has echancements that make it usable with cms.
[stw,并行,拷贝算法,配合老年代CMS使用]
分代垃圾回收器-老年代
SerialOld: a stop-the-world,mark-sweep-compact collector that uses a single GC thread
[stw,串行,标记压缩算法]
ParallelOld: a compacting collector that uses multiple GC threads
CMS(Coucurrent mark sweep): a mostly concurrent,low-pause collector;
4 phases:inital mark, concurrent mark,remark,concurrent sweep
[并发,垃圾回收和应用程序同时运行,降低stw的时间(官方号称可以到200ms)]
非分代垃圾回收器
G1: 10ms
ZGC: 零停顿,1ms,pk c++
Shennandoah: 与ZGC 二选一
Eplison
JVM调优 第一步,了解生产环境下的垃圾回收器组合
JVM参数分类:
标准参数: -开头,所有HotSpot都支持
非标准参数: -X开头,特定HotSpot版本支持
不稳定参数: -XX开头,下个版本可能取消[java -XX:+PrintFlagsFinal]
查看jvm运行参数: -XX:+PrintCommandLineFlags
最终参数值: -XX:+PrintFlagsFinal
默认参数值: -XX:+PrintFlagsInitial
出处:www.bilibili.com/video/BV1UX…
==========================完============================