年轻代与老年代的调优(笔记整理)

几个常见名词

年轻代(young 区)
从年轻代空间(包括Eden和Survivor 区域)回收内存被称为 Minor GC
空间太小可能导致对象直接进入 old区 。如果old区 满了,会触发full gc。但也不能过大,过大会引起回收耗时过长,导致应用阻塞。

老年代(old 区)
从老年代GC称为Major GC
空间过小会产生old区小碎片,放不下大对象,引起频繁full gc。如果用了缓存,old区也要适当大些,同时缓存不应无限增长。

存活区(Survivor)
Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。

伊甸园(Eden)
整个堆内存(heap)=young+old

GC(垃圾回收机制)

堆区有两个Survivor区,新建的对象会存活在在Eden中。Eden区如果没有足够的空间时会引发一次young区的GC。

在经历一次MinorGC之后,Eden中的存活对象就会被移动到第一块survivor space-S0,此时Eden被清空;

等Eden区再次填满,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space-s1;此时S0和Eden被清空,然后下一轮S0与S1交换角色。
如果 Survivor的空间不足或经历16次Minor GC还能在新生代中存活的对象会通过分配担保机制被送入老年代。

老年代负责分配担保让Survivor无法容纳的对象直接进入老年代。如果剩余空间小于转移对象大小,将直接进行 FullGc

进入老年代的对象

  • 大对象会直接进入老年代(避免频繁复制)
  • 在程序中长期持有了对象的引用(对象年龄达到指定阈值也会进入老年代)
  • survivor 区太小,只能进入老年代

FullGC

执行 Minor GC(年轻代GC) 的时候,JVM 会检查老年代中最大连续可用空间是否大于了当前新生代所有对象的总大小
如果大于,则直接执行 Minor GC(年轻代GC)(这个时候执行是没有风险的)
如果小于,JVM 会检查是否开启了空间分配担保机制,如果没有开启则直接改为执行Full GC
如果开启担保机制,则 JVM 会检查老年代中最大连续可用空间是否大于历次晋升到老年代中的平均大小,如果小于则执行改为执行Full GC
如果大于则会执行 Minor GC(年轻代GC),如果 Minor GC(年轻代GC) 执行失败则会执行 Full GC

出现Full GC的时候经常伴随至少一次的Minor GC,但不绝对。Major GC的速度一般会比Minor GC慢10倍以上

内存溢出

老年代只有在新生代对象转入及创建大对象、大数组时才会出现空间不足的现象。当执行Full GC后空间仍然不足,则会抛出如下错误:
java.lang.OutOfMemoryError: Java heap space

GC频率监控

  • jstat -class  类加载统计
  • jstat -compiler  编译统计
  • jstat -GC  垃圾回收统计
  • jstat -gccapacity  堆内存统计
  • jstat -gccnew  年轻代垃圾回收统计
  • jstat -gccold  老年代垃圾回收统计
  • jstat -gcnewcapacity  年轻代内存统计
  • jstat -gcoldcapacity  老年代内存统计
  • jstat -gcmetacapacity  元空间内存统计
  • jstat -gcutil  gc整体统计
  • jstat -gccause  gc原因

 ps -eo pid,tty,user,comm,lstart,etime | grep 【pid】 查看进程运行时间

  • YGCT :从应用程序启动到采样时年轻代中 gc 所用时间(s)
  • FGC :从应用程序启动到采样时 old  代(fullgc)gc 次数
  • FGCT :从应用程序启动到采样时 old  代(fullgc)gc 所用时间(s)
  • GCT :从应用程序启动到采样时 gc 用的时间(s)
  • YGC/YGCT=年轻代单次gc时间
  • FGC/FGCT=fullGC单次时间
  • YGC/time=年轻代gc频率
  • FGC/time=老年代gc频率

判断fullgc是否正常的标准:FGCT/FGC<=200ms

fullGC 频繁出现的可能原因

  • 对象引用长期未释放
  • survivor 区太小
  • old 区太小
  • System.gc()方法的调用

Full GC调优办法
1:让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组

2:年轻代小对象尽量多,大对象则尽可能直接进入老年代。年轻代由于使用标记复制算法进行回收内存,速度很快

3:Eden区如果没有足够的空间时会引发一次young区的GC,通过-XX:SurvivorRatio 进行调整 Eden 和 Survivor 比例大小。少量对象的存活,适合复制算法(年轻代),大量对象存活,适合标记清理或者标记压缩(年老代)。

性能测试-GC问题整理的更多相关文章

  1. JVM GC(整理)

    1 GC类型 1 )YGC  一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发YGC ,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区.然后整理S ...

  2. [面试] Java GC (未整理完)

    Java GC简介 什么是 GC ? Java程序不用像C++程序在程序中自行处理内存的回收释放.这是因为Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收. 你都了解哪 ...

  3. JVM垃圾回收(GC)整理总结学习

    基本回收算法 1. 引用计数(Reference Counting)比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最 ...

  4. Jmeter+jenkins接口性能测试平台实践整理(二)

    本篇为Jmeter+jenkins+Ant方式执行性能测试 1.设置JDK,ANT环境变量: 2.build.xml文件: <?xml version="1.0" encod ...

  5. Jmeter+jenkins接口性能测试平台实践整理(一)

    最近两周在研究jmeter+Jenkin的性能测试平台测试dubbo接口,分别尝试使用maven,ant和Shell进行构建,jmeter相关设置略. 一.Jmeter+jenkins+Shell+t ...

  6. jmeter实操及性能测试基础知识整理 - 不断更新

    主要基于jmetet工具 有任何疑问直接留言,可以相互讨论 线程组菜单: 线程数:并发数量Rame-Up时间(秒):多久跑完线程数,比如线程是10,Rame-Up时间是10秒,就是10秒内跑完10个线 ...

  7. JVM内核-原理、诊断与优化学习笔记(五):GC参数

    文章目录 堆的回顾 串行收集器 并行收集器 ParNew(par-并行的缩写,new-新生代,所以只是新生代并行) Parallel收集器 参数设置 -XX:MaxGCPauseMills -XX:G ...

  8. GC算法基础

    寻找垃圾对象的算法:1. 引用计数(无法处理循环引用) 2. 根寻法(被广泛引用在gc算法中) 清理垃圾的算法: 1. 标记复制  2. 标记清理  3. 标记整理 分代算法的好处: 1. 分代处理, ...

  9. Jvm内存区域和GC

    运行时数据区域 线程私有 程序计数器 正在执行的字节码指令的地址(native方法时为undefined) Java虚拟机栈 存储栈帧(局部变量表,操作数栈,动态链接,方法出口)OOM,StackOv ...

随机推荐

  1. windows环境:dos 通过ftp连接到vsftpd 显示乱码解决方法

    转载至:https://blog.csdn.net/nydia_xiangxiang/article/details/48627921?utm_source=blogxgwz8 感谢原作者的分享 FT ...

  2. JavaSE01:初始Java

    java语言的优势 简单性 面向对象 跨平台性(可移植性) 高性能 分布式 动态性 多线程 安全性 健壮性 java最大的特点是跨平台性 Java的跨平台性来源于Java虚拟机(jvm),Java靠在 ...

  3. Beego学习笔记四:编写Model

    MVC实践一:编写模型 1>     打开mysql数据库,设计表的结构 <1>登录mysql数据库,如下 <2>这三个标注的参数皆有用,需要谨记. <3>创 ...

  4. rabbitmq:配置rabbitmq-management插件

    rabbitmq提供了一个图形的管理界面,用于管理.监控rabbitmq的运行情况,它是以插件的形式提供的,如果要启用需要启用插件 一.启用插件 rabbitmq-plugins enable rab ...

  5. Maven基础。

    ---恢复内容开始--- Maven: 1.概念. * maven 是一个项目管理工具. * maven的作用. 1.jar包.依赖管理.将jar包放在jar包仓库(pom.xml),不需要每个项目都 ...

  6. Springboot+Mybatis的逆向工程

    Mybatis逆向工程,自动生成 entity类和常用的增删改查方法. 1.pom.xml引入类 <!-- 通用mapper 用于mabatis封装的基础增删改查的功能--><dep ...

  7. Xinetd超级守护进程

    Xinetd超级守护进程 00.什么是xinetd服务 xinetd(extended Internet services daemon), 是新一代网络守护进程服务程序, 又叫超级守护进程. 经常用 ...

  8. Linux之ubuntu下载

    (转载) ubuntu 16.04国内下载地址: 中科大源 http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开源镜像站 http://mirr ...

  9. PAT 乙级 1022.D进制的A+B C++/Java

    1022 D进制的A+B (20 分) 题目来源 输入两个非负 10 进制整数 A 和 B (≤),输出 A+B 的 D (1)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. ...

  10. 金生芳-实验十四 团队项目评审&课程学习总结

    实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课 ...