JVM实战(20)——jstat实战(1)

这篇具有很好参考价值的文章主要介绍了JVM实战(20)——jstat实战(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

本章和下一章,我们将通过之前讲过的两个案例,看看如何在生产环境下使用jstat对JVM运行情况进行分析。我们先来回顾下商户BI系统。

1.1 案例背景

假设生产环境有一个商户BI系统,用于商户日常经营数据的分析和报表输出,其大致运行逻辑如下:

  1. 商户会在业务平台上进行运营,产生各种各样的业务数据;
  2. Hadoop、Spark等会对这些业务数据进行计算,然后放入MySQL、HBase之类的存储中;
  3. 最后,我们的BI系统会把各种存储好的数据暴露给前端,允许前端基于各种搜索条件筛选和展示。

JVM实战(20)——jstat实战(1),jvm专题,jvm

系统刚上线时,商户数量只有几万家,生产机器配置是4核8G,新生代分配1.5G,Eden区有1G:

JVM实战(20)——jstat实战(1),jvm专题,jvm

1.2 内存使用模型估算

每个商户的主页,前端每隔几秒钟就会发送一个请求给BI系统,用于生成一种实时报表。每台机器差不多每秒抗500个请求,由于报表需要的数据量比较大,一般每个请求需要加载约100KB的数据到内存中,每秒500个请求总共就是50MB数据,每次Young GC过后存活对象也就几十MB:

JVM实战(20)——jstat实战(1),jvm专题,jvm

根据上述内存使用模型的估算,每秒需加载50MB数据到Eden区,那3分钟左右就会将Eden区占满,触发Young GC。在1G的内存空间中进行Young GC的效率是很高的,基本上10ms左右就可以搞定,所以BI系统 每运行几分钟就会出现10ms左右的卡顿 ,但是对终端用户和系统运行基本没有影响:

JVM实战(20)——jstat实战(1),jvm专题,jvm

二、代码示例

我们通过一段代码来模拟下上述情况,先来看下JVM参数配置。

2.1 JVM内存参数

-XX:NewSize=104857600 -XX:MaxNewSize=104857600 -XX:InitialHeapSize=209715200 -XX:MaxHeapSize=209715200 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3145728 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

上述,我们把Java堆内存设置为200MB,其中年轻代100MB,Eden占80MB,Survivor各占10MB,老年代100MB。

2.2 程序源码

    public class Demo1 {
        public static void main(String[] args) throws InterruptedException {
            Thread.sleep(30000);     // main线程休眠30s,以便jstat命令通过PID观察
            while (true) {
                loadData();
            }
        }
        private static void loadData() throws InterruptedException {
            byte[] data = null;
            for (int i = 0; i < 50; i++) {
                data = new byte[100 * 1024];    // 100KB
            }
            data = null;
            Thread.sleep(1000);         // 模拟上述操作全部发生在1s内
        }
    }

上述程序代码中,while(true)用来模拟每秒50次请求,每次请求加载100KB数据,也就是每秒5MB数据。

2.3 jstat分析

当我们启动程序后,main线程会阻塞30s,此时我们可以先通过jps命令查找当前JVM的进程ID——2236:

JVM实战(20)——jstat实战(1),jvm专题,jvm

然后在30s内执行下述命令,统计JVM状态,每隔1s打印一次,共打印1000次:
jstat -gc 2236 1000 1000

我们来看下输出结果:

JVM实战(20)——jstat实战(1),jvm专题,jvm

首先,看下 EU 那列,表示Eden区的内存使用情况,刚开始一直都是6MB多的使用量,此时main线程还在阻塞中:

JVM实战(20)——jstat实战(1),jvm专题,jvm

之后,线程恢复运行,Eden区的使用空间每秒钟都在增长,根据差值计算大概就是每秒5MB,与我们的代码逻辑吻合:

JVM实战(20)——jstat实战(1),jvm专题,jvm

当Eden区使用接近80MB时,再要分配就失败了,此时触发了一次Young GC,Eden区的使用空间降低到4573.3KB:

JVM实战(20)——jstat实战(1),jvm专题,jvm

针对上述示例,我们可以通过jstat命令清晰的看出,新生代对象增速为5MB/s左右,大约十几秒就会触发一次Young GC,每次Young GC回收大约70MB空间,耗时1ms,所以Young GC的速度是很快的,即使回收800MB空间,也就耗时10ms左右。

三、总结

本章,我们通过jstat命令分析了BI系统中新生代对象的GC情况。通过jstat命令,我们清晰的看到虽然系统每隔十几秒就会进行一次Young GC,但是Young GC耗时很小,而且没有存活对象进入老年代,所以系统运行的效率还是挺高的。文章来源地址https://www.toymoban.com/news/detail-804537.html

到了这里,关于JVM实战(20)——jstat实战(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JVM 查看配置 jinfo 及使用 jstat,查看堆栈jstack及GC

    1. Jinfo  查看正在运行的Java应用程序的扩展参数: 包含 JVM 参数与 java 系统参数 命令:  jinfo pid    2 jstat  查看堆内存使用情况及 GC 回收频率等: jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]  2.1 jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况   

    2024年02月13日
    浏览(36)
  • JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

    查看PID信息 首先启动一个服务  使用jps 和 jps -l 的区别,使用jps -l 能够显示出服务的名称  熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK JMAP、JSTAT和JSTACK是Java开发中常用的工具,用于分析和调试Java应用程序。它们的使用场景如下: JMAP:JMAP用于生成Java堆转储快照,以便分析

    2024年02月03日
    浏览(47)
  • JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

    目录 一. 前言 二. jps(Java Virtual Machine Process Status Tool) 三. jstack 四. jmap(Memory Map)和 jhat(Java Heap Analysis Tool) 五. jstat(JVM统计监测工具) 六. hprof(Heap/CPU Profiling Tool) 七. 总结     工欲善其事,必先利其器。在日常的企业级 Java 应用开发、维护中,我们可能会碰到下面

    2024年02月04日
    浏览(44)
  • JAVA工程师面试专题-JVM篇

    目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、垃

    2024年02月21日
    浏览(47)
  • JVM实战(13)——JVM优化概述

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

    2024年01月18日
    浏览(48)
  • JVM系统优化实践(20):GC生产环境案例(三)

    您好, 这里是 「 码农镖局 」 CSDN博客,欢迎您来,欢迎您再来~ 某新手开发工程师接到了一个保存Elasticsearch日志的任务,以供后续分析之用。但写代码的时候,误将保存日志的代码段弄成了无限循环,程序启动后,没用多久就崩溃了。 另一名工程师在动态创建类时,没有

    2024年02月16日
    浏览(51)
  • JVM实战(19)——JVM调优工具概述

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

    2024年01月18日
    浏览(51)
  • (一)JVM实战——jvm的组成部分详解

    本节内容是关于java虚拟机JVM组成部分的介绍,通过其组成架构图了解JVM的主要组成部分。 ClassFile: 字节码文件 - javac: javac前端编译器将源代码编译成符合jvm规范的.class文件,即字节码文件 - class文件的结构组成: 魔术、Class文件版本、常量池、访问标志、类索引、父类索引

    2024年04月25日
    浏览(46)
  • JVM(2)实战篇

    内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。 内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没有特别说明则讨论的都是堆内存泄漏。 比如图中,如

    2024年02月20日
    浏览(36)
  • JVM实战(26)——SystemGC

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

    2024年01月19日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包