您当前的位置: 首页 >  面试

java持续实践

暂无认证

  • 0浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JVM 面试题:如何优化JVM参数做到只有Young GC(minor GC)

java持续实践 发布时间:2021-05-16 15:10:43 ,浏览量:0

本文来源如下专栏: 从0带你成为jvm实战高手

1.先从当前环境和访问的服务每秒中qps大概多少,在堆中new的对象大概多少, 比如qps:10000/s 每次做sql查询100条数据,创建单个对象有20个属 因为每个字段都是一个基本数据类型,对象头4字节+引用类型4字节+实例数据(Integer:4 Long:8)+数据填充(变成8的倍数)假设每个属性32b,则一个对象32*20b=600b 那么一秒钟创建的对象为 100*10000*600b=600M

默认的jvm参数配置的空间大小: 2.分析当前虚拟机分配给当前程序的堆内存 假设4核8g机器,当前java启动参数为-Xms:3G -Xmx:3G 新生代和老年代比率为2:1 新生代:2G , 默认对应survivor0:survivor1:eden=1:1:8 即200M:200M:1600M 老年代:1G

gc的过程分析: 3.每秒查询100条数据, 新创建的对象为600M,那么3s后eden区满了,因为此时1800M>1600M,进行分配担保的判断, 此时新生代对象1800M>老年代1G内存,默认-XX:HandlePromotionFailure开启,那么此时判断老年代空闲内存1G大于每次进入老年代的平均对象的大小0,此时进行minor gc, 假设存活的对象为300M,那么此时通过复制算法, 复制到survivor0区域时发现内存不够用, 则将300M对象直接进入到老年代,然后在隔3s后再次触发minor gc, 即第6s,此时老年代对象为600M,第9s后老年代900M,第12s触发minor gc是发现分配担保失败, 因为老年代空闲内存100M

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0420s