JVM(java virtual machine)
引言
jvm和java无关 只要是能编译成.class文件都可以运行
jdk包括jre jre包括jvm
概念:Garbage Collector(垃圾回收器) GC
关于GC的几个问题
什么是垃圾?怎么定位垃圾?垃圾回收算法?多种垃圾回收器?怎么调优?
1.什么是垃圾?
忘了回收垃圾会导致内存泄漏,但是java不会,jvm有垃圾回收机制
没有引用指向这个对象,这个对象就是垃圾对象
2.怎么定位垃圾?
python中:引用计数:计算有多少个引用指定它。没有引用就是垃圾对象。但是有循环引用问题:1->2->3->1
java中:根搜索方法(Root Searching) 设置很多根,从根开始搜索,搜索不到的对象就是垃圾对象
根对象包括main方法的栈帧 运行时常量池 方法区的静态引用 load进去的class对象
3.垃圾回收算法:
标记清除算法(Mark-Sweep) 拷贝算法(Coping) 标记压缩算法(Mark-Compact)
标记清除算法:把垃圾标记起来清除掉
优点:简单
缺点:使空间碎片化,变成一块一块的空间,可能不能给大对象分配空间
拷贝算法:只允许用一半空间,清除时把有用的放到另一边,其他的全部清除
优点:效率高
缺点:浪费空间,只能用一半
标记压缩算法:把有用的对象全部放在一边,然后清除垃圾对象
优点:没有碎片
缺点:效率低
4.十种垃圾回收器
分代模型:新生代-老年代(6种) ,提高回收效率,分代属于垃圾回收模型
常用组合:ParNew->CMS Serial->Serial Old Parallel Scavenge->Parallel Old
新生代 :new/young 分为三块空间 eden survivor(s1) survivor(s2)
用的是拷贝算法 效率非常高
过程:new对象先进入eden ,在这个区域很容易被回收,只有5%-10%没有被回收 ,活着的进入s1或者s2
s1中满了之后清除,把活着的放入s2,s2满了清除,活着的放入s1,往返。对象每跳一次年龄加一,到了一定年龄 (CMS默认6 其他回收器默认15)进入老年代
注:年龄可以通过参数:-XX:MaxTenuringThreshold配置
老年代 old
用标记算法 效率低
小结:
new对象->先判断栈是否能分配->能的话进栈->方法结束弹出(导致逃逸:有引用指向它,但是被弹出去了) 效率高,不用经过GC
->对象太大直接进老年区(老年区内存大)
->不大不小进入eden区->晃悠晃悠到老年区
Serial ->Serial Old 单线程,随着内存越来越大,清理时间太长,效率低
Serial 串行 新生代
a stop-the-world(记住,意思告诉内存我要垃圾回收了,让所有线程都停止) coping collector which uses a single GC thread 单线程拷贝算法
Serial Old 老年代
a stop-the-world mark-sweep-compact collector which uses a single GC thread 单线程标记算法
Parallel(并行) Scavenge ->Parallel Old 多线程,(jdk8默认)
Parallel Scavenge
a stop-the-world coping collector which uses multiple GC threads 多线程拷贝(多个线程同时清理)
Parallel Old
a compacting collector that uses a multiple GC threads 多线程标记算法
ParNew->CMS (内存超大时)
CMS:
concurrent(并发,线程工作线程和垃圾回收线程可以同时进行) mark sweep 并发标记清除(碎片化空间)
a mostly concurrent,low-pause(短暂停) collector
缺点:产生冲突(有些不是垃圾的对象跑着跑着变成垃圾,有的垃圾对象跑着跑着不是垃圾了)
没有一个版本的垃圾回收器默认是CMS
四个阶段:
初始标记(initial mark):标记和根直接相连的对象 stop(时间短)
并发标记 (concurrent mark): 顺着根继续往下标记(并发运行)
重新标记(remark): 纠正标记错误的对象 stop(时间短)
并发清理 清理垃圾对象
ParNew是Parallel Scavenge的变种,对ps算法增强,与CMS算法配合的更好
什么是调优?
根据需求进行JVM规划和预调优
优化运行jvm的运行环境(慢,卡顿)
解决JVM运行中遇到的各种问题(OOM) 内存溢出:内存被占满系统崩了 内存泄漏:内存被占用没有被释放掉
G1 ZGC Shenandoah Epsilon(4种)