JVM马士兵老师

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种)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值