看完就能懂!ElasticSearch-垃圾回收器优化

这篇具有很好参考价值的文章主要介绍了看完就能懂!ElasticSearch-垃圾回收器优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当代主流虚拟机(Hotspot VM)的垃圾回收都采用“分代回收”的算法。“分代回收”是基于这样一个事实:对象的生命周期不同,所以针对不同生命周期的对象可以采取不同的回收方式,以便提高回收效率。 看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

  • 新生代:分三个区:一个Eden区,两个Survivor区,默认内存占比8:1:1。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到两个Survivor区(中的一个)。当这个Survivor区满时,此区的存活且不满足“晋升”条件的对象将被复制到另外一个Survivor区。对象每经历一次Minor GC,年龄加1,达到“晋升年龄阈值”后,被放到老年代。
  • 老年代:在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代。
  • java8已经没有持久代了,改为元数据区,主要存放元数据,例如Class、Method的元信息。

对象分配过程

  • 对象比较大的时候,超过-XX:PretenureSizeThreshold设置值时,直接分配到老年代;
  • 向eden申请空间创建新对象,eden没有合适的空间,因此触发minor gc
  • minor gc将eden区及from survivor区域的存活对象进行处理:
  • 如果这些对象年龄达到阈值(MaxTenuringThreshold),则直接晋升到年老代
  • 若要拷贝的对象太大,那么不会拷贝到to survivor,而是直接进入年老代
  • 若to survivor区域空间不够/或者复制过程中出现不够,则发生survivor溢出,直接进入年老代
  • 其他的,若to survivor区域空间够,则存活对象拷贝到to survivor区域
  • 此时eden区及from survivor区域的剩余对象为垃圾对象,直接抹掉回收,释放的空间成为新的可分配的空间
  • minor gc之后,若eden空间足够,则新对象在eden分配空间;若eden空间仍然不够,则新对象直接在年老代分配空间

垃圾回收器

  • 新生代收集器有:Serial(单线程),ParNew(多线程),Paraller Scavenge(侧重于吞吐量控制)
  • 老年代收集器有:CMS(获取最短回收停顿时间为目标的回收器,该回收器是基于“标记-清除”算法实现的), Serial old,Parallel Old
  • G1收集器可作用与新生代和老年代(JDK9默认垃圾收集器)

ParNew+CMS工作机制

-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75 //老年代内存使用率超过75%触发垃圾回收
-XX:+UseCMSInitiatingOccupancyOnly

ParNew:复制算法,将内存分为大小相等的两块,每次使用其中的一块一块用完时,将存活的对象复制到另一块。 CMS:使用标记-清除算法。整个过程分为四步:

  • 初始标记:STW,标记GC Roots能关联到的对象,速度很快
  • 并发标记:GC Roots Tracing过程。耗时。和用户线程一起执行(并行)
  • 重新标记:STW,标记并发标记过程中程序运行导致标记变化的对象,时间比初始标记长,远比并发标记短
  • 并发清除:耗时。和用户线程一起执行(并行)

G1

G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色:

  • G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。
  • G1的Stop The World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间。并基于用户指定的停顿时间来选择进行垃圾回收的区块数量。G1 采用增量回收的方式,每次回收一些区块,而不是整堆回收。
  • G1 收集线程在标记阶段和应用程序线程并发执行,标记结束后,G1 也就知道哪些区块基本上是垃圾,存活对象极少,G1 会先从这些区块下手,因为从这些区块能很快释放得到很大的可用空间,这也是为什么 G1 被取名为 Garbage-First 的原因。

G1的各代存储地址是不连续的,每一代都使用了n个不连续的大小相同的Region,每个Region占有一块连续的虚拟内存地址。如下图所示:

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

Remembered Sets(Rset)

逻辑上说每个Region都有一个RSet,RSet记录了其他Region中的对象引用本Region中对象的关系。

Collection Set(CSet)

记录了GC要收集的Region集合,集合里的Region可以是任意年代的。

G1工作模式

  • YoungGC年轻代收集

在分配一般对象(非巨型对象)时,当所有eden region使用达到最大阀值并且无法申请足够内存时,会触发一次YoungGC。每次younggc会回收所有Eden以及Survivor区,并且将存活对象复制到Old区以及另一部分的Survivor区。

  • mixed gc

当越来越多的对象晋升到老年代old region时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并不是一个old gc,除了回收整个young region,还会回收一部分的old region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择哪些old region进行收集,从而可以对垃圾回收的耗时时间进行控制。

问题解决

通过指标数据,发现es集群存在新生代内存分配过小,导致young gc 频繁。 通过命令查看

jstat -gc pid 1000 1000

发现新生代内存仅分配了约1g,而老年代占到了29g。一种解决方案就是增大新生代,具体大小需要根据经验和调整后指标数据决定。

此外,调研发现,一些大的互联网公司,如美团,携程,es的垃圾回收器使用的都是G1。综上,直接替换es的垃圾回收器为G1。 看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly

直接替换为

-XX:+UseG1GC
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

看完就能懂!ElasticSearch-垃圾回收器优化,程序员,elasticsearch,java,jvm

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
早日升职加薪迎娶白富美走上人生巅峰!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-852379.html

到了这里,关于看完就能懂!ElasticSearch-垃圾回收器优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 常见的垃圾回收器(上)

    常见的垃圾回收器(下) Serial垃圾回收器 + SerialOld垃圾回收器 Serial是一种单线程串行回收年轻代的垃圾回收器 回收年代和算法 年轻代:复制算法 老年代:标记-整理算法 优点 单CPU处理器下吞吐量非常出色 缺点 多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处

    2024年04月14日
    浏览(38)
  • JVM之垃圾回收器

    垃圾回收常见面试题: 如何判断对象是否死亡。 简单的介绍一下强引用、软引用、弱引用、虚引用。虚引用与软引用和弱引用的区别、使用软引用能带来的好处 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算法,各自的特点? HotSpot 为什么要分

    2024年02月14日
    浏览(44)
  • 【JVM】13. 垃圾回收器

    2023年05月29日
    浏览(39)
  • 深入解析G1垃圾回收器

    本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 上篇文章我们聊了CMS,这篇就来好好唠唠G1。 CMS和G1可以说是一对欢喜冤家,面试问你CMS,总喜欢把G1拿进来进行比较。 G1在JDK7中加入JVM,在JDK9中成为了

    2024年02月11日
    浏览(47)
  • 深入解析CMS垃圾回收器

    本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 目录 CMS简介 运作过程 初始标记 并发标记 并发预处理 可取消的并发预处理 重新标记 并发清除 CMS的缺陷 处理器资源敏感 无法处理“浮动垃圾” 内存碎

    2024年02月11日
    浏览(44)
  • JVM常见的垃圾回收器(详细)

    1、Young为年轻代出发的垃圾回收器。 2、Old为老触发的垃圾回收器。 3、连线代表的是垃圾回收器的组合。CMS 和Serial Old连线代表CMS一旦不行了,Serial Old上场。 1、什么是STW? STW是Stop-The-World缩写: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结丶应用程序停顿的⼀种状态。

    2024年02月08日
    浏览(35)
  • JVM垃圾回收器G1详解

    在我们应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发

    2024年02月09日
    浏览(37)
  • 说一下 JVM 有哪些垃圾回收器?

    如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器

    2024年02月22日
    浏览(42)
  • JVM基础(8)——CMS垃圾回收器

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月16日
    浏览(44)
  • Java虚拟机(JVM)、垃圾回收器

    JRE(Java Runtime Environment,运行环境) 所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。 JDK(Java Development Kit,开发工具包) 用来编译、调试Java程序的开发工具包。包括Java工具(javac/java/jdb等)和Java基础的类库(java API )。 JVM(Java Virtual Machine,虚拟机) JRE的一部分,

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包