GC和GC Tuning 垃圾回收
GC基础知识
1、什么是垃圾
没有任何引用指向的一个对象或者多个对象
C语言中申请内存:malloc free
c++:new delete
java:new
自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型问题:
1、忘记回收
2、多次回收
2、如何找到垃圾
1、引用计数(有缺陷,不能解决循环引用)
2、根可达算法
哪些对象是根对象呢?
根线程变量、静态变量、常量池、JNI指针
从根找不到的 都是垃圾,和根有联系的就不是垃圾
3、常见的垃圾处理方法
1、标记清除 Mark-Sweep
碎片化,位置不连续
2、拷贝算法
没有碎片,浪费空间,位置连续
3、标记压缩 Mark-Compact
效率低
JVM内存分代模型
1、在部分垃圾回收器使用的模型
2、新生代 new + 老年代 old + 永久代(1.7)/元数据区(1.8)
- 永久代:元数据-Class
- 永久代必须指定大小限制,元数据可以设置,无上限
- 字符串常量 jdk1.8版本存在 堆里面
3、新生代 = Eden + 2个survivor区:
YGC回收之后,大多数的对象都会被回收,或者的进入s0
再次TGC,活着的对象Eden+ s0 —> s1
再次TGC,Eden + s1 ----> s0
年龄足够–>老年代(15 或者 16 )
s区装不下 就 扔给老年代
堆内存逻辑分区
4、老年代
- 1.包含 顽固分子
- 2.老年代满了FGC
5、GC Tuning - 尽量减少FGC
- MinorGC = YGC
- MajorGC = FGC
垃圾回收器
Serial(串行)单线程
- Serial 年轻代 串行回收,一个线程进行垃圾回收
java程序运行会产生卡顿现象就是因为 STW
Eden区的对象满了,STW(stop the world),让singleGC上场,指向垃圾回收,执行完之后,你再继续运行
PS 年轻代 并行回收
- 并行回收,多个线程同时进行垃圾回收,效率比单线程要高
parnew :配合CMS的并行回收
ConcurentMarkSweep
CMS:并发的
非常复杂
在垃圾回收的时候也同时进行应用程序,降低STW的时间(200ms)
在CMS之后诞生了
G1 (STW:10ms)
ZGC(STW :1ms)
我们就只对下面几个垃圾回收器进行调优,因为这是默认的垃圾回收器
1.8 默认的垃圾回收: PS + ParallelOld
-XX :+ PrintCommandLineFlags
-XX:+PrintFlagsFinal 最终参数值