1.2个模型 分代模型和分区模型
如图jvm8 左分代 右分区
2.新生代 复制算法的运行过程
eden产生对象--->复制对象到from和to(survivor区)--->清除eden区(空间大)
---->from对象复制到to--->清除from区变成to区--->fromto交换位置--->
一定年龄可以加入老年代
3.6种垃圾回收器(垃圾多会卡顿,回收器卡顿时间不同)
1.serial(卡顿的原因,最古老的收集器) oracle offical: a stop-the-world(STW) copying collector which uses a single gc thread
就是停止复制算法单线程的操作配对serial old 十几m
2.parallel scavenge(ps是上面的,并行)(1.8默认使用) 几百m--几g
3. cms concurrent mark sweep(并发标记) 同时回收垃圾,业务同时运行会改变垃圾回收
根据对象的关系垃圾出来, 20g
4. g1: SATB snapshot at the beginning(灰色对象和白色对象 记录下来,如果有黑色指像白色,就认为是垃圾,反之)(改对象的指向)
分区,导致可以相互运行不影响,Rset(region)分区集,可以方便子节点访问父节点 百g
5. zgc 4t-16t(11不完善,jdk13)
4.(cms)三色标记算法(用多种方式标记,cms用头部信息标记,其他的用01 10 11标记)(最后找完全部是黑色) bug浮动垃圾
concurrent mark sweep并发标志清除
白色: 只有自己一个节点(没有遍历到节点)
灰色: 自己标记完成,但是没有来得及标记孩子节点, 垃圾回收器,只需要从灰开始,不用从根开始,找孩子
黑色: 自己已经标记,孩子节点都标记了
incremental update : 如果对象 的指向被改变,则把要更新的对象标记为灰色
例子:
A(黑)--->B(灰)--->C(白)
A--->D(白) 如果改上C连D 把C变为灰色
1.有隐蔽的bug:垃圾回收线程,由于对象有多个属性,会漏标,变灰找到下一个对象,就变黑,下一个属性要用这个, 但是他是黑的所以找不到
所以最后remark阶段,从头找,放漏标
5.ZGC zero paused gc 10ms colored pointer + load barrier(颜色指针+负载屏障)
不支持32位,不支持指针压缩(通常用44位)
---没有用的空间18bit----|finalizable|remapped|marked1|marked0|object addr
初始: 都是remapped状态
过程: 从根开始找到一个对象就标记为remark0
如果使用这个内容,就拿到 jvm负载屏障区域(改变了内存地址,所有垃圾回收拷贝内存都要变)
6.调优实战(linux) 要写个线程池
java -version
// -开头的是标准参数 ,-X是非标准参数 -XX
java -X
//查看虚拟机所有参数 700个参数可以调
java -XX:+PrintFlagsFinal | more
//初始大小 最大大小 打印
java -Xms200M -Xmx200M -XX:PrintGC com.top.jamsee
//输出 allocation failure分配失败 50000k-1000k(200000k) 年轻代全部50m清理到1m,总内存200m
//去安装阿里的 arthas阿尔萨斯 查看java的运行的状态,切换到目录运行jar包
java -jar arthas-boot.jar
//敲数字指向要监控的java程序 如 1
//cpu 内存,runtime运行环境,运维都是重启
dashboard
exit可退出容器
//不用安装的
//查看那些对象吃内存,实际不用,需要让堆暂停业务暂停,heapdown,已经OOM了,查看这个日志,大厂不能这样说
jmap -histo 1232 | head -20
7.常见调优参数
-Xms 初始堆大小
-Xmx 最大堆大小
-Xss 线程栈大小
-XX:NewSize=n 设置年轻代大小
-XX:NewRatio=3 设置年轻代和老年代 的比值. 1年轻代:3老年代
-XX:SurvivorRatio=3 survivor有2个 eden3:2survivor
-XX:MaxpermSize=10M 持久代大小
//收集器设置,+号代表打开,-代表关闭
-XX:+UseSerialGC 设置串行收集器
-XX:+UseParallelGC 设置并行收集器
-XX:+UseConcMarkSweepGC 使用并发收集器,CMS标志清除法,并发收集低停顿
-XX:+UseParNewGC 并行收集新生代的垃圾,,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生
-XX:+UseCMSCompactAtFullCollection 开启对老年代的压缩.减少碎片
-XX:LargePageSizeinBytes=128m 设置内存分页大小对内存的提升(百度)
-XX:+UseFastAccessorMethods get/set方法转为本地代码
-Djava.awt.headless=true 修复linux的tomcat处理图像产生的可能的一个bug
//垃圾回收统计
-XX:+PrintGC
-XX:+PrintGCDetails
-Xloggc:filename //与上面几个配合使用,日志信息记录到文件(文件名)