jconsole工具检测堆内存变化

该博客主要围绕JConsole工具检测堆内存变化展开,虽未给出具体内容,但可知核心是利用JConsole对堆内存的动态情况进行监测,这在信息技术领域对系统性能分析等方面有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于垃圾回收机制讲的都是比较底层了,你们有没有用Jmeter经过实战测试过没有,这个下去多练习,通过Jmeter去测试参数的

调优,你测百度是不准的,因为他有很多限制的,这个不准其实,一般真正测试是怎么测试呢,这个测试跟你电脑有关系,我的电脑

请求可能稍微慢一点,很难测试出来的,像我们之前的时候,我就看别人去做一下测试,别人都是特别清楚的,你的服务器是多少G的,

是单核还是双核,目前它的堆内存大小是多少,后台有个工具直接检测出来的,比如你测之前肯定能够实时知道你当前堆内存是多少,

达到多少是会堆内存溢出的,我们都是通过工具可以检测出来的,这是我们今天要讲的两个工具,第一个工具叫做jconsole,还有一种

叫做visual VM,这两个工具都是针对于什么,对JVM性能做一个监控,比如最基本的,堆内存多少,包括你当前加载多少个类啊,包括对你

系统的分析,可视化界面的,通过一些命令查,那命令很少用到,你知道有那几个命令就行了,但是我就不讲了,我就讲在公司里比较实用的,

基本上都是通过控制台分析的,记不记得我当时给你们说过一个问题,当初说了什么问题,死锁是通过什么工具进行诊断出来的,

我当时说过这个问题吧,等一会我通过这个工具给大家演示一下,我们写段代码有个死锁现象,通过jconsole,给大家演示一下,死锁的一个

诊断,但是他不能够帮你解决,代码哪一行出现死锁现象,还给你们讲一下,比如今后您们到大一点的公司,或者你们自己开公司,你们要

知道,很多人访问比较慢,我会告诉大家,访问慢的原因,不是我们服务器的原因,调用别人第三方的接口,因为他们看视频卡的原因,

卡不卡和我没关系,我没办法解决,很多人以为是我没有解决好,跟我没关系,为什么呢,像阿里云,一般卖视频软件的,平均下来都是

8毛一个G,我4毛一个G就是便宜一半的钱了,如果按照目前来说,用大概5,6千的,只要花2,3千块钱,如果换成阿里云比较好的提供商

的话,费用至少提高了几倍,2倍以上,所以这个卡的原因,没任何影响,你们有没有发现,像我们在初创阶段,我们没有去测试高并发量

有多少,但是关于网站安全的都是做了防御的,包括脚本注入的问题都是做过的,一般来说,为什么要讲到这个呢,如果你自己想创建

公司的时候,想做一个比较好的系统,这个时候我可以告诉大家,你们在上线之前,一般都会做压力测试的,你们都听说过压力测试的吧,

如果自己开公司想测一下并发量,想测一下我的性能有多好,或者是什么呢,你们今后如果进互联网公司,他一般在项目上线之前,

做个压力测试,比如测一下我的网站的性能,到底能够达到多少,他首先会准备一个测试服务器,在这个时候我们就给你讲一下,

个人能力只是把你的业务能力提升,个人能力取决于你自己本身的一个专研,让你们知道知识点,一般在做压力测试的时候,怎么测试的,

准备一台测试服务器,但是大家要记住,测试服务器和生产服务器是相同的,为什么要相同啊,我们来讲一下,如果你搞得不同的情况下,

导致测试的情况你在生产环境是不一样的,所以一般情况下,绝大多数在做压力测试的时候,测试环境的测试和生产环境一般来说都是相同的,

比如说在正常情况下,像生产环境的服务器,基本上都是8个G,有的公司默认是配置4个G,可能有些会调到8个G,但是一般来说,

一般会大于一半的内存,服务器在8个G,因为有些项目他比较小,正常情况下如果你的服务器,如果是tomcat服务器的话,

只装tomcat的情况下,内存可能就和你的内存就是相同的,这是大家要区分的一个概念,我给你们说配置一半是什么意思呢,一般来说正常

情况下,都先配一半的,因为有一半会给其他的应用程序,会占内存,如果你们把内存全部配置给JVM的话,导致其他的程序不能够

申请内存了,一般像大的公司,要么TOMCAT是tomcat的服务器,要么就是数据库服务器,每个服务器之间是互不影响的,不是在单个服务器

上面,这个时候服务器的配置是8个G的,他的8G内存,他的JVM最大堆内存大小,就是为8个G,但是最终原因是什么,取决于项目,这个不完全是

规定出来的,就是你们在做压力测试之前,都会怎么样呢,应用程序占内存,我明明是4个G,但是我们查出来只有3.8G左右,你配置4个G是

没关系的,他最终申请的时候,你设置大点总比设置小点好吗,有一部分确实是被其他程序占用,但是这个内存占用具体占多少,这个也不好

说是不是,配大点总比配小点有好处的,是不是这样的,这个大家知道就行了,不要太纠结于这些,那这个时候我就和你们说一下,我要讲一下

什么呢,一般在生产环境里面的时候,他如果要去调优的时候,怎么调优呢,会怎么样呢,会写一个测试报告,有的地方有另外一种叫法,

叫性能检测报告,尤其大家去一些比较大的公司,性能检测报告,这是什么意思呢,这是我们在后面有一个专题,这个专题讲什么呢,

讲互联网安全架构,我们专门讲互联网架构,互联网安全架构的时候,其实性能检测报告其实也包含了安全的,比如我们通过一些

扫描工具,检测你的代码哪里写的有问题,通过一些基本的语法去判断,扫描一下哪些代码是有缺陷的,找出来,但是基本的都是通过

脚本注入,SQL注入的问题,所以这些都是测试做的,但是为什么要讲呢,如果去做架构师的时候,聊到安全的时候,能够聊得非常深,

从最基本的安全架构原理,去访问最基本的安全,一般是有测试人员去安排好的,他们会有专门的测试工具,做压力测试的,

做压力测试的时候,他们自己会写个测试报告,一般以吞吐量为标准,来进行请求响应,就是他们请求响应的时候,首先给你们讲一下,

客户端去模拟的时候,他也会做报告记录的,客户端模拟也会取决网络传输的,你可能在局域网做通讯的时候,可能往往会比外网要快,

所以一般在局域网测试的时候,他只测个大概,如果你局域网达到这个也挂,我们之前的那个项目,能够达到7,8千,其实那个很假,

正常项目里面,代码是非常复杂的,不可能吞吐量7,8千的,很少很少,除非你的服务器非常好,所以当时我们写那个项目,代码本身来说

要查很多资源的,所以当时的吞吐量是2,3千,到了2,3千之后,内存满了的情况下,会导致雪崩效应,其他服务器就全部访问不了了,

别人一般访问的时候,还有基本的防御系统,网关,你们可以把雪崩效应理解为不断的去请求,你就可以这样理解就行了,就表示服务器

访问不了了,挂了,你们可以先这么去理解,我会专门取讲的,熔断策略,不是特别高达上的东西,网关系统,它会做安全处理,

包括权限处理,它会预测一下,比如我明天做活动的时候,会突破一百万的访问量,那我会在专门做测试的时候,我至少要能达到一百万,

能够不挂就行了,如果达到100万挂了,你要做优化,一般通过代码到服务器层面,基本的高并发解决方案,高并发解决方案其实蛮多,

不光是在服务器层面的,在代码层面,在数据库层面,还有可能在整个网站架构层面,这是我会详细讲到的高并发解决方案,

压力测试其实也是相当于做一个高并发的测试,但是压力测试往往不会特别精准,压力测试往往是一个人在做请求,不可能是

很多电脑去请求,所以他不一样的,一般公司在做压力测试的时候,最基本的,要写个测试报告的,它会通过这个报告基本的预测一下,

最高峰能够达到多少,模拟请求,DOS,XXS,上传漏洞,这些大家不要担心,就是别人都会有防御的,最基本的请求,公网IP只有一个,

伪造IP要改请求,那个是比较麻烦的,我们有没有到过12306网站,他其实不是通过伪造IP去解决高并发的,其实你会发现,

像我去抢的时候,大概4,5百个员工用同一个IP去抢票,整个公司都不能抢票了,大家都用了同一个IP地址,所以抢不了了,

根本抢不了了,所以我们会有一些第三方的软件,因为它会把请求交给第三方,通过第三方抢票软件,他会到12306上去做了一个

抢票的功能,他可能会买了很多服务器,给你做模拟抢票,我会讲互联网安全架构,企业黑名单白名单啊,检测报告一般不是你们写的,

一般是测试人员写的,它会告诉开发审核一下,项目经理才会知道,我的服务器达到多少的时候会怎么怎么样
在这里讲两个可视化的工具,一个叫jconsole,还有一个叫visual VM,这个是专门做JVM栈和堆的检测的,包括还有死锁现象,

都会检测出来的,这个时候我给你们讲一下,jconsole是干嘛用的呢,你们有没有了解过jps,jmap,这些命令其实也是检测jvm的

性能的一些指令,一些语句,但是这个东西用起来会比较麻烦,你们可能也用过,我打开cmd,我输入jps,他主要是什么目的啊,

我在这边演示一把,jps的命令相当于怎么样呢,我能够去读到,有多少JAVA程序在运行的

比如我先做用002程序,其实他是死锁现象,我就不去说死锁现象,你们看一下,我把它运行一下的时候,你就可以找到

Test002

以后也是用可视化工具去查的,jconsole怎么用呢,他其实是一个可视化命令的,如果你们之前的时候,在你们安装JDK目录,

这个软件是JDK自带的,在哪个目录呢,在JDK安装目录的bin文件夹里面,双击jconsole就行了,这个时候大家就可以去看一下,

怎么连呢,双击一下jconsole.exe,而且他还有一个特别高大上的一个功能,他可以直接远程连接哪个服务器,你要知道生产

环境的服务器是linxu版本的,可以直接联系到生产环境的jvm信息,为什么这里会显示两个,第一个是jconsole本来就是一个

java程序,我再来讲一下,这个jconsole主要是做什么目的呢,只要是java写的应用程序,他都是可以监控到的
package com.learn.test;


public class Test006 {
    static Object o1 = new Object();
    static Object o2 = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                synchronized (o1) {
                    System.out.println("线程1锁o1");
                    try {
                        Thread.sleep(1000);//让当前线程睡眠,保证让另一线程得到o2,防止这个线程启动一下连续获得o1和o2两个对象的锁。
                        synchronized (o2) {
                            System.out.println("线程1锁o2");
                        }
                    } catch (InterruptedException e) {                  
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                synchronized (o2) {
                    System.out.println("线程2锁o2");
                    synchronized (o1) {
                        System.out.println("线程2锁o1");
                    }
                }
            }
        }).start();

    }

}

他这边你们可以不去连接SSL,因为我们没有这个证书,就用不安全连接进行连接,这个时候他就会展示一个界面

这个界面你们可以看到,为什么说他比较占内存呢,因为它很多数据都是实时的,他后台需要实时读取新数据,肯定是比较耗内存的,

就好比我现在写一个while循环,一直去刷新数据的情况下,是比较占内存的,所以不要太去纠结这个软件占不占内存,只要这个软件实用

就行了,他这里会显示你这个堆的使用信息,我们现在已经使用了21M,最大40M,你们有没有印象我之前是怎么讲的,一般默认是4个G,

但是我们查的时候只有3.8G左右,可能还有0.2G被其他程序给占用了,所以记住啊,这个值大致相同,你也可以看到我们的堆内存发生变化,

都是实时监控的,比如我可以知道这个程序去年的情况是怎么样,都可以知道的,你比如这个时候我讲一下,如果是在做压力测试的时候,

怎么做呢,别人在做压力测试,你要看一下你堆内存的情况,然后看到一些变化,CPU的占用情况,以及线程数,你们待会就知道了,我们不光是

GC线程,还有很多很多线程,至少10几个线程,这里线程非常多,但是大家知道一个概念就行了,你们如果有兴趣,如果你们的程序跑的非常长的

时间的话,可以看看一年之前的变化,一个月之前的,我这个因为是2我当前的电脑,我们可以看看12个小时的变化,你们发现问题没有,这个

堆内存是不是一直在变高,你们看到变化没有,是不是一直在增高,他可以监控TOMCAT,都是可以监控的,这都是没问题的,你看它是一直在

增高,为什么呢,因为我这个程序是一个死循环,不过现在已经死锁了,你们可以去查一下内存变化

主要查的是堆内存,这些东西是不是我都讲过的,新生代,这是什么,在堆内存里面是不是有一个eden区,from区和to区,

我们也可以去分析到eden区的内存发生变化

你们发现没有,这个eden区,我们可以看一个变化好吗,堆内存大致是55M,接着我们看一下eden区里面的,eden区大概是

使用了10M,那我给你们讲一下,还有相差40M在哪个地方呢,你们有没有发现from区和to区没数据啊

这个其实就是展示from区和to区的,根本就没数据的,为什么呢,因为垃圾回收机制只有在5,6次之后才会到S0区,

或者S1区,但是如果进入到老年代看一下,至少要达到15次之后

这个程序没有定义非常大的内存的,反正这个大体我给你们说一下,这里面已经查到非堆内存,你们知道非堆内存是什么吗,

你们有没有谁知道,堆内存指的是什么,我之前讲过的,不知道你们有没有听说过,一般非堆内存是指方法区的内存

当前有多少个类,你们看一下,加载的类总数4020个,已加载4020个,你们有没有发现一个问题,我们这个程序怎么可能加载

这么多类呢,你们没有发现问题吗,我们这么简单一个程序,加载这么多类呢,记住我们的项目都是引用了JDK的,他可能有一些类

是被JDK所占用的,而且讲一下,你们以后整合到Spring的,或者整合一些常用框架的,1千都不算什么,有几万个的,我们之前项目

一个万多个类,一个jar包就是几百个,我们的项目至少有40,50个jar包,有的jar已经达到上千个了,所以4000个还好,我之前的项目

是1万多,默认就是占用1千5百左右,因为项目比较大的时候表都有100多个,这个我就不细说了,这里又基本的信息,连接的名称

这是虚拟机版本信息,供应商是ORACLE公司,然后运行时间是44分钟时间,进程CPU时间是1分钟左右,总编译时间是37.9秒,

活动线程是34,峰值40个,守护线程28个,线程总数92个,有人说我们怎么可能这么多个,你不会发现有问题吗,我们怎么会有

这么多线程的,不光是GC线程

不只是GC线程,默认的几个,待会会看一下的,我们待会进入项目测一下,应用程序不光有GC线程,RMI线程特别特别多,

当前版本是GBK版本的,库的基本的地址,引导类的地址,总物理内存有多少,当前已加载4020个了,你们如果想远程的话,

去监听的,除非你通过命令查,命令查特别痛苦,所以一般是远程连接生产服务器,查一下内存变化,尤其是测试做联调的

时候,我要知道那一秒内存达到峰值,整个堆内存发生变化

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值