GC 和GC Tuing

一、什么是垃圾

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

  1. 方法区空间增大
  2. 老年代空间增大
  3. 新生代空间减小
  4. 禁止使用System.gc()方法(或者少使用)
  5. 使用标记-整理算法,尽量让连续空间保持最大
  6. 排查代码中的无用大对象(内存泄漏)

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 -- 启动时默认的命令行参数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值