JVM调优之:垃圾收集器
2019独角兽企业重金招聘Python工程师标准>>>
java语言最大的特点就是可以进行自动垃圾回收处理,无需开发人员过于关注系统资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但同时也增加了软件系统的负担。一个不合适的垃圾回收方法和策略会对系统造成不良影响。
1.垃圾与回收算法思想
引用计数法:
引用计数法是最经典也是最古老的的一种垃圾回收方法,引用计数器的实现很简单,对于一个对象A,只要任何一个对象引用了A,则A的计数器上就加1,当引用失效就减1,当A的引用计数器值为0时,则A就不会再被引用。
引用计数器的实现也很简单,但是有一个严重的问题,即无法处理相互引用的情况。就比如A对象引用了B对象,同时B对象也引用的A对象,除此之外在没有其他对象应用A和B,则A和B引用计数器的值都不为0,但是A和B均不会再被使用,这样就导致不能回收到A和B对象,引起内存泄露。
标记-清除算法:
标记清除算法是现代垃圾回收算法的思想基础。标记清除算法把垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点可达的对象。因此未标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。标记-清除算法最大的一个问题就是空间碎片。以为回收后的空间是不连续的,工作效率低于连续的内存空间。
复制算法:
复制算法是一种相对高效的回收方法。它的核心思想是:将原有的内存空间分成两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,清除正在使用的内存块中的所有对象,交换两个内存块角色,完成垃圾回收。在JVM新生代中survivor中使用了复制算法进行垃圾回收。如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,因此在垃圾回收时,复制算法的效率是很高的。且复制是统一将存活对象复制到新的内存区域中,因此不会产生空间碎片。
标记-压缩算法:
复制算法的高效性是建立在垃圾对象多,存活对象少的前提下。这种情况年轻代经常发生,但是对于老年代往往是存活对象多,垃圾对象少,在这种情况下复制的成本也将很高,因此复制算法并不适合老年代垃圾回收。
标记-压缩算法是一种老年代的垃圾回收算法,它在标记-清除算法的基础上做了一些优化。标记-压缩算法首先也是需要从跟节点开始,对所有可达对象做一次标记,然后将所有存活对象压缩到内存的一端,然后清除掉边界外的所有空间。这种算法避免了碎片的产生,也不需要两个相同的内存空间,因此性价比较高。
增量算法:
对大部分垃圾回收算法而言,在垃圾回收的过程中,应用系统软件处于一种“Stop the World”的状态。在“Stop the World”状态下应用程序的所有线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果垃圾回收时间很长,应用系统暂停时间也会很长,影响用户体验。
增量算法的基本思想是如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么可以让垃圾收集和应用程序交替止执行。每次,垃圾收集之回收一小片内存区域,接着切换到应用程序执行。如此反复直到垃圾回收完成。这种间断式的垃圾收集虽然减小了应用系统的等待时间,但是由于线程的切换和上下文替换的消耗,会使得垃圾回收的整体成本升高。
分代:
前面介绍的复制、标记-清除、标记-压缩等算法,并没有一种算法可以完全替换其他算法。它们都有各自的优缺点。因此根据垃圾回收对象的特点不同,使用不同的回收算法才是明智之举。
分代就是基于这种思想,它将内存区域根据对象的特点分成不同的内存区域,根据每块区域对象的特征不同使用不同的回收算法,以提高工作效率。
2.垃圾收集器的类型
按线程数分:
串行:一次只使用一个线程继续垃圾回收。
并行:一次开启多个线程进行垃圾回收。在cup能力较强时使用并行可以提高垃圾收集效率,缩短GC停顿时间。
按工作模式分:
并发式:并发式垃圾收集器与应用系统交替工作,以尽可能减少应用系统的停顿时间。
独占式:独占式垃圾收集器一旦运行“Stop the World”就停止应用程序运行,直到垃圾收集完全接受,才允许应用程序执行。
按工作内存区间分:
新生代垃圾收集器:只在新生代工作。
老年代垃圾收集器:只在老年代工作。
3.垃圾收集器
新生代串行收集器:单线程、独占式、复制算法;单CPU处理器时性能优越。
老年代串行收集器:单线程、独占式、标记-压缩算法;
并行收集器:工作在新生代、将新生代串行收集器多线程化,回收策略、算法、参数和新生产串行收集器一样。
新生代并行收集器:和并行收集器一样,但是可以设置“最大垃圾收集停顿时间”和“吞吐量大小”。自适应GC条件策略。
老年代并行收集器:标记-压缩算法,可以设置“最大垃圾收集停顿时间”和“吞吐量大小”。
CMS收集器:并发、标记、清除
G1收集器:标记压缩算法,可以进行精确停顿控制(在M时间内,停顿时间不超过N),预期优于CMS收集器。
转载于:https://my.oschina.net/u/3100849/blog/961038
JVM调优之:垃圾收集器相关推荐
- JVM性能调优3_垃圾收集器与内存分配策略__享学课堂
Stop The World现象 GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数. 内存分配与回收策略 对象优先在Eden分配,如果说Eden内存空间不足,就会发生Minor GC ...
- JVM性能调优2_垃圾收集器与内存分配策略__享学课堂
判断对象的存活 引用计数法: 优点:快,方便,实现简单: 缺点:对象相互引用时,很难判断对象是否该回收. 可达性分析: 这个算法的基本思路就是通过一系列的称为"GC Roots"的 ...
- JVM(五)JVM调优
文章目录 一.调优实践 1.1 规划 1.1.1 规划步骤 1.1.2 规划案例 1.2 解决JVM运行过程中出现的问题 1.2.1 用jstack定位锁相关问题 1.2.2 OOM问题的定位方式 1 ...
- JVM垃圾回收器-G1垃圾收集器
Java8的G1垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#ga ...
- jvm相关,垃圾收集算法,垃圾收集器,jvm调优--学习笔记
对内存合理分配,优化jvm 参数,就是为了尽可能减少新生代(Minor GC),或者是整个老年代(Major GC) ,或者是整个 Java 堆 (Full GC) ,尽量减少 GC 带来的系统停顿, ...
- 面试-JVM-类加载-类加载器--自定义类加载器-JVM调优
文章目录 ==类加载== 谈谈你对类文件结构的理解?有哪些部分组成? 谈谈你对类加载机制的了解? 编写java代码是如何运行起来的? 类加载机制 类加载各阶段的作用分别是什么? 有哪些类加载器?分别有 ...
- SpringBoot项目优化和Jvm调优(亲测,真实有效)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:星朝 原文:cnblogs.com/jpfss/p/9753 ...
- JVM调优,面到了阿里性能优化师!
小K 菜哥,我看你朋友圈,你好像换工作了? 菜哥 对啊,前阵子被产品经理烦的头疼,就想换工作了.刚好找到一个不错的. 小K 给我说说呗,让我也参考一下,我现在工资才15K,主管死坑,我也想换工作了 菜 ...
- Jvm 系列(七):Jvm 调优-工具篇
工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...
- jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
2019独角兽企业重金招聘Python工程师标准>>> 文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我 ...
最新文章
- java中json重复数据结构_JS实现去除数组中重复json的方法示例
- 互联网协议 — BGP 边界网关协议 — Route(路由信息)
- mysql之 explain、optimizer_trace 执行计划
- mysql8.0默认引擎是什么_MySQL8.0新特性【转】
- 近期有哪些值得读的QA论文?| 专题论文解读
- [Ljava.lang.String; cannot be cast to java.lang.String
- fat+linux权限,Linux 文件和目录权限详细介绍
- 疫时急速挑战,AI 落地大考
- HandyJSON:Swift语言JSON转Model工具库
- Coverity代码静态检测工具介绍
- mac 运行android模拟器速度慢,Mac下顺畅的安卓模拟器:网易MuMu
- 如何选择固定资产标签?
- 大数据开发 电脑内存大小
- android电量优化方法,Android性能优化——电池使用优化
- 打印出js对象里面的内容
- Mysql Workbench connection ssl not enable问题解决
- python画三维坐标图像_用python检索xyz坐标并绘制三维图形
- pandas之dropna()的用法
- springboot之jpa支持
- 真够色!这个AI项目让画师们激动中又透露着瑟瑟发抖!忍不住想尝试