jvm基础知识
2022-11-01 10:24:07 14 举报
jvm基础知识
作者其他创作
大纲/内容
标记-清扫(Mark-and-sweep)
可达性分析法:如果我们将一些GC Roots对象作为起始点,从这些节点向下搜索,搜索到的路径为引用链,如果有一些对象没有任何引用链相连,那么这个对象对于GC Roots是不可达的,即使它们之间可能相互产生关联,所以将其判定为可回收对象。
垃圾回收算法
Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。对于Server模式下有两个用途:1. 在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;2. 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
强引用
G1收集器
https://www.cnblogs.com/sjxbg/p/9388615.html
第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。即将所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。 具体使用什么方法GC,Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率低的话,就切换到“标记-扫描”方式;同样,Java虚拟机会跟踪“标记-扫描”的效果,要是堆空间碎片出现很多碎片,就会切换回“停止-复制”模式。这就是自适应的技术。
ParNew(并行GC)收集器
标记-整理(Mark-Compact)
判断是否为可回收对象
垃圾收集器参数总结
jvm实战调优
分代式垃圾回收
Serial(串行GC)收集器
用来描述一些还有用但是不必须的对象,系统将要发生内存溢出异常之前,将会把这些对象列入回收范围之中进行第二次回收,如果还是不够那就只能抛出内存溢出的异常了。
软引用
CMS(并发GC)收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。新生代:每次垃圾收集都有大量对象死去,只有少量存活,就选择复制算法 老年代:对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”,或者“标记-整理”算法来进行回收。
引用分类
分代(generational collecting)
ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。在单CPU工作环境内绝对不会有比Serial的收集器有更好的效果,随着可以使用的CPU的数量的增加,它对于GC时系统资源的有效利用还是很有好处的,它默认开启的收集线程数与CPU的数量下同,在CPU非常多的环境下,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。
Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
G1(Garbage First)收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。还有一个特点之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代,老年代)。G1收集器的特点:**并行与并发:**G1利用多CPU、多核环境下的硬件优势,缩小stop-the-world的时间。**分代收集:**G1不需要其他收集器配合就可以独立管理整个GC堆,但它能够采用不同的方式来处理。空间整合:整体上是“标记-整理”,局部上是基于“复制”的算法来实现的可预测的停顿:降低停顿时间,G1建立了可预测的停顿时间模型,能让使用者明确的指定在一个长度M毫秒内的时间片段,消耗在垃圾收集的时间不得超过N毫秒,这已经适实时java(RTSJ)的垃圾收集器的特征了G1收集的步骤:初始标记并发标记最终标记筛选回收
在特定的情况下,一些垃圾收集算法会优于其它算法。基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。
只要存在,垃圾收集器就不会回收对象。Object obj = new Object();
虚引用
自适应算法(Adaptive Collector)
为了提升效率,把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。优点:不会出现碎片问题。 缺点:1、暂停整个应用。2、需要2倍的内存空间。
用来描述非必须对象,但是强度比弱引用更弱,被弱引用关联的对象只能生存到下一次垃圾收集发生之前,垃圾收集工作的时候,无论是否必要都会回收掉只被弱引用关联的对象。
Parallel Old(并行GC)收集器
弱引用
原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GC roots开始遍历所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题。 缺点:1、暂停整个应用;2、会产生内存碎片。
复制(copying)
Parallel Scavenge(并行回收GC)收集器
垃圾收集器
Serial Old(串行GC)收集器
一个对象是否有虚引用,与其生命周期毫无关系,也无法通过虚引用取得一个对象实例,只被虚引用的对象,随时都会被回收掉
收藏
收藏
0 条评论
回复 删除
下一页