性能优化|JVM内存分配机制2

点击上方蓝字关注我们 文末有惊喜

对象优先在新生代分配

  • 如果对象能够在eden区分配,那么就直接在eden区分配
  • 如果eden区域大小不够新对象存储的话,则会触发一次minor gc,
  • 如果minor gc后发现对象也无法在s区分配,则会直接在老年代中分配
  • 如果老年代也无法存储,则会触发full gc

什么情况下,对象会直接在老年代中分配?

  • 大对象会直接进入老年代 什么叫做大对象呢,这个是由我们配置的参数决定的 -XX:PretenureSizeThreshold=xxx 如果新分配的对象超过这个值,就会直接在老年代中分配对象,这样做的目的是减小大对象来回复制带来的gc 时间损耗,需要注意的是这个参数只在serial和parNew两种收集器下生效
  • 长期存活的对象会直接进入老年代
    • 如何判对对象是长期存活的?虚拟机会给每个对象的头部分配一个字段,记录对象的年龄,年龄默认为1,在经历一次minor gc之后,如果对象还存活,则将年龄加1;
    • 如果对象的年龄达到了 -XX:MaxTenuringThreshold参数配置的值,默认为15,则会直接进入老年代
  • 动态年龄判断,决定是否进入老年代 动态年龄判断是在minor gc之后出发的。在每次minor gc之后,会按照年龄大小进行排序,从年龄小的开始累加内存空间,如果累加到年龄为10的对象的时候,内存空间已经超过了s区的50%,这个时候就会把大于年龄10的存活对象全部移动老年代中;
  • minor gc之后,s区放不下,会直接移动到老年代中

什么叫空间分配担保机制?

jvm在每次minor gc之前,都会计算老年代的剩余可用空间,如果可用空间小于年轻代里面所有对象之和,如果没有配置担保参数(“-XX:-HandlePromotionFailure),这个时候就会直接执行full gc,如果配置了担保参数,就不会立即发生full gc,这个时候需要判断老年代可用空间是否大于之前每次minor gc后移动到老年代的平均大小,如果大于,则还是执行minor gc,否则执行 full gc ,流程图如下:

如何判断对象是否被回收

  • 引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用 失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管 理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题

  • 可达性分析算法

这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点, 从这些节点开始向下搜索,找到的对象都标记为非垃圾对象,其余未标记的对象 都是垃圾对象 GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。

本文分享自微信公众号 - 乐哉开讲(Lezaikaijiang),作者:乐哉开讲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 15分钟快速了解eureka及实战

    我们不管在进行分布式开发还是微服务开发,都需要接触一个组件,那就是服务治理中心,必须有一个组件为你提供和发现服务的功能,注册中心可以由zookeeper、rei...

    AI码师
  • 性能优化|讲的最清楚的垃圾回收算法

    标记-清除分为标记和清除两个阶段,在标记阶段jvm会在需要回收的对象上面打上标记,标记阶段完成后,jvm开始执行清除动作,这个阶段会清除掉那些被标记的需要回收的...

    AI码师
  • 对select组件的封装

    在我们平时开发过程中,可能都会使用到下拉框这个组件,里面的值要么是动态的,要么是静态的,但是方便日后的维护,大多数都会将他配置成代码项封装成集合,通过遍历,生成...

    AI码师
  • Go程序GC优化经验分享

    最近一段时间对《仙侠道》的服务端进行了一系列针对GC的调优,这里跟各位分享一下调优的经验。

    李海彬
  • 详解 Python 方法之类方法 & 静态方法

    这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过。

    Rocky0429
  • 视频一键识别生成字幕

    前不久我介绍了通过视频生成字幕的技术原理(博客、B站),我现在把这个功能打包成一个易于操作的界面,如下图所属:

    孙亖
  • 10行python代码制作笑死人不偿命的倒放gif

    现在网络平台上各种有很多倒放视频和倒放gif,其中有些非常的有意思,例如以下图片,慎点,笑死人行哥不偿命

    行哥玩Python
  • python对接ihuyi实现短信验证码发送

    在日常生活中我们经常会遇到接收短信验证码的场景,Python也提供了简便的方法实现这个功能,下面就用代码来实现这个功能。

    砸漏
  • 通过推测语义布局,层级形式文本到图像的合成《Inferring Semantic Layout for Hierarchical Text-to-image Synthesis》一、从文本来推断语义布

    perceptual loss 图1. 给定一个文本描述,构成一个语义结构,(box+mask),由前面的两个大条件,合成图片。与Reed的思路很像,但解决...

    水球喵子
  • 依赖管理(一):图片、字符串文件和字体在Flutter中怎么用?

    前文中,我与你介绍了Flutter的主题设置,也就是将视觉资源与视觉配置进行集中管理的机制。

    拉维

扫码关注云+社区

领取腾讯云代金券