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

    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日
    浏览(14)
  • JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

    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日
    浏览(8)
  • JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

    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日
    浏览(13)
  • JAVA工程师面试专题-JVM篇

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

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

    JVM实战(13)——JVM优化概述

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

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

    JVM系统优化实践(20):GC生产环境案例(三)

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

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

    JVM实战(19)——JVM调优工具概述

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

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

    (一)JVM实战——jvm的组成部分详解

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

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

    JVM(2)实战篇

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

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

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

    2024年01月19日
    浏览(7)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包