之前有位同学面试时的一个面试题:如何配置能让JVM不进行FullGC?大家仔细看完这篇文章应该就有答案了

1-7、回顾内容参照40讲 点击链接

8JVM参数与程序

参数配置:
-XX:NewSize=100M-XX:MaxNewSize=100M-XX:InitialHeapSize=200M-XX:MaxHeapSize=200M-XX:SurvivorRatio=8-XX:MaxTenuringThreshold=15-XX:PretenureSizeThreshold=20M-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:d:/gc.log程序:public class _54_RealTimeEngine {static final int M = 1024 * 1024;static final int K = 1024;public static void main(String[] args) throws InterruptedException {Thread.sleep(20_000);while(true){loadData();}}private static void loadData() throws InterruptedException {byte[] data = null;for(int i=0;i<4;i++){data = new byte[10*M];}data = null;byte[] data1 = new byte[10*M];byte[] data2 = new byte[10*M];//触发第一次OLDGCbyte[] data3 = new byte[10*M];data3 = new byte[10*M];//触发第一次YGCThread.sleep(1_000);}private static void allocate(int size) {byte[] bytes = new byte[size];}}

程序说明:

每秒有80M的对象要分配到堆中,其中30M在1秒内是存活的。

事实上垃圾收集时的存活对象要看是在哪条语句触发了GC,比如在byte[] data1 = new byte[10*M];语句触发GC ,那么存活对象是0

10、基于jstat分析程序运行的状态

??问题

1、红色1标注的区域,为什么每次都增加10M,而不是每次存活的30M?

答:执行到data3 = new byte[10*M];时发现Eden不够放,触发YoungGC,30M存活复制到S区,发现放不下,直接放入老年代,YGC后Eden放入10M。

2、红色2、3标注的区域,为什么第一次OU增加了30M ,后面增加的是10M 或 20M?

答:比如第二次YGC时OU增加了20M,是因为Eden区本身已经有10M,这时是执行到byte[] data3 = new byte[10*M];触发YGC,也就是说提前了一条语句触发,此时存活20M,这20M晋升,然后放入byte[] data3 = new byte[10*M]; data3 = new byte[10*M];生成的对象

3、红色3标注的区域,为什么到了60多M就会变成30M,而不是OU回收完的0M?

答:此时Eden区已存在30M多点,Eden区不够放,触发了YGC,结果发现老年代也不够放,触发OldGC,回收完是0M,然后放入存活30M

4、红色4标注的区域,为什么YGC从7直接变成了9?

答:eden放不下(触发了YGC -1),且S区放不下,直接放老年代(此时没有对Eden区回收),发现老年代也放不下了,触发OldGC,,回收完是0M,然后放入存活30M。再然后放入触发YGC的10M,发现Eden放不下,再次触发了YGC -2

5、红色5标注的区域,为什么会连续3秒FullGC

答:触发FullGC原因就是老年代空间不够放晋升对象了。第3次OldGC 完成后Eden和Old区使用空间很多:,接着存放存活对象,触发了第4次OldGC,完成后回到程序初始运行状态,此时要晋升的对象有50M多点,又触发了OldGC

11、对JVM性能进行优化

分析这个程序,方法结束后所有的对象都是垃圾对象,也就是说一秒内分配的对象只要S区可以放下,那么下一秒就可以被回收了。此时需要增加S区的大小

参数配置:-XX:NewSize=200M-XX:MaxNewSize=200M-XX:InitialHeapSize=300M-XX:MaxHeapSize=300M-XX:SurvivorRatio=2-XX:MaxTenuringThreshold=15-XX:PretenureSizeThreshold=20M-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:d:/gc.log

Eden 100M,From To 50M 这样就避免了FULLGC了,但YGC频繁没发避免的,因为每秒耗用的内存太多80M,但没关系,可以看看下图,一次YGC平均耗费4.5ms

本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明。详细内容:

如果购买,成功后加QQ群找群主返现10元

054、JVM实战总结: 案例实战:每日百亿数据量的实时分析引擎,如何定位和解决频繁Full GC问题?相关推荐

  1. jvm性能调优实战 -33每日百亿数据量的实时分析引擎,如何定位和解决频繁Full GC问题

    文章目录 Pre 运行程序用的示例JVM参数 Code 基于jstat分析程序运行的状态 对JVM性能进行优化 小结 Pre jvm性能调优实战 - 27亿级数据量的实时分析引擎,为啥频繁发生Full ...

  2. 040、JVM实战总结:案例实战:每日百亿数据量的实时分析引擎,为啥频繁发生Full GC ?

    1.上文案例再分析 2.一个日处理上亿数据的计算系统 MySQL数据库以及其他数据源里提取大量的数据加载到自己的JVM内存里来进行计算处理. 总负载:每分钟大概需要执行500次数据提取和计算的任务   ...

  3. 现身说法:实际业务出发分析百亿数据量下的多表查询优化

    今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化,俗话说的好,一切脱离业务的架构都是耍流氓,接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优 ...

  4. Redis基本使用及百亿数据量中的使用技巧分享

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 作者:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码B ...

  5. jvm性能调优实战 - 32一个10万并发的BI系统,如何定位和解决频繁Young GC问题?

    文章目录 Pre 模拟代码的JVM参数设置 示例Code 如何在windows上执行命令? 通过jstat观察程序的运行状态 Pre jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Y ...

  6. 百亿数据量下,掌握这些Redis技巧你就能Hold全场

    来源:https://0x9.me/aos9t 一.Redis封装架构讲解 实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewL ...

  7. 掌握这些 Redis 技巧,百亿数据量不在话下!

    一.Redis封装架构讲解 实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面. 这里可以打开看一下,Ne ...

  8. opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场

    程序猿DD 一.Redis封装架构讲解 实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面. 这里可以打开 ...

  9. mysql 百亿数据_从SQL Server到MySQL,近百亿数据量迁移实战

    沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:Java 的版本是 1.2,C# 尚未诞生,MySQL 还没有被 Sun 收购,版本号是 3.23.工程师们选择了当时最合适 ...

最新文章

  1. NB-IOT UE的小区接入过程
  2. C语言试卷终稿,C语言试卷终稿B1.doc
  3. python装饰器原理-Python函数装饰器原理与用法详解
  4. 学习笔记Kafka(六)—— Kafka Consumer API及开发实例
  5. Java static作用
  6. 上传文件漏洞案例分析
  7. Android悬浮按钮锚点位置,Android 滑动定位+吸附悬停效果实现
  8. 替换Quartus 自带编辑器 (转COM张)
  9. python多线程没用_Python中的多线程cv2.imshow()不起作用
  10. oracle schema_oracle数据库全局统计更新
  11. celery-02-安装与使用说明-for-redis
  12. 图像空域增强:直方图方法
  13. 读书笔记《推荐系统实践》- 个性化推荐系统总结
  14. android 支付宝 6002,支付宝调用H5支付页面返回6002网络连接错误
  15. php 美化注册界面,美化,从登录界面背景开始
  16. 普通型母函数和指数型母函数
  17. app提交到iTunes失败
  18. 矩阵旋转(翻转)刷题总结
  19. Centos7在公网使用PCDN拨号
  20. matlab画一个放大图中图

热门文章

  1. c语言 syn扫描,syn flooder*** (C语言)
  2. 用python怎样用程序输出文字_如何用Python输出PPT中的文字信息
  3. 聊聊零基础的我是如何学python的_零基础学python-4.3 对象的比较
  4. LCA(最近公共祖先)
  5. 大数据可视化陈为智慧树_智慧树知到_大数据可视化_答案新版
  6. Servlet ---- cookie session
  7. node制作http服务器,NodeJS 搭建 HTTP 服务器
  8. MySQL 引擎 阿里_MySQL引擎讲解-阿里云开发者社区
  9. java自由布局_java怎么在界面上随意摆放位置?
  10. php获取微信图片访问权限,微信小程序访问图片出现403,图片防盗链的解决办法...