当前位置: 首页 > news >正文

JVM和GC监控技术

一、监控技术简介

  1. JVM是什么?
  2. 项目里面有JVM吗?
  3. JVM跟Tomcat有什么关系?
  4. 为什么需要去分析JVM?
1. JVM(全称:Java Virtual Machine),Java虚拟机

是Java程序运行的环境,它是一个虚构的计算机,相当于电脑安装系统一样,可以运行应用程序,很多应用使用java语言开发,java最大特点跨平台(windows、linux),真正的java程序在java虚拟机上运行

在这里插入图片描述
如上图:JDK、JRE、JVM:JDK(开发工具包)包含了JRE(运行环境),运行时类、库,JRE包含了JVM(java虚拟机)

2. 项目里面有JVM吗?

让tomcat运行起来,就需要有JRE,而JRE自带了JVM

3. JVM跟Tomcat有什么关系?
  • 一个tomcat是一个java进程,其中有很多线程(与有多少个app无关)
  • 一个tomcat启动一个JVM,其中可以有很多APP
  • 一个tomcat中部署的多个APP,虽然同处一个JVM,但是由于无法相互调用,可以认为是分布式的
4. 为什么需要去分析JVM?

JVM对于tomcat来说就相当于运行系统

二、JVM的生命周期

  1. JVM实例诞生:
    当启动一个java程序时,一个JVM实例就诞生了,任何一个拥有public void main(String[] args)函数的class都可以作为JVM实例运行的起点
  2. JVM实例运行:
    main()作为该程序初始线程的起点,任何其他线程均有该线程启动,JVM内部有两种线程,守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程
  3. JVM实例的消亡:
    当程序中的所有非守护线程都终止时,JVM才退出

三、JVM的GC机制

  1. GC概述

    • garbage collection是进程查看堆内存,分辨哪些对象还在被使用中,哪些对象已经不再使用,并删除不再使用的对象的过程
      • 被使用:指程序中的某些部分仍然由对对象的引用
      • 不再被使用:就是指没有任何部分持有该对象的引用,对于不再被使用的对象,其消耗的内存可以被回收重用,(没有保护(守护线程)就回收掉,释放掉更多的内存给需要的线程使用)
  2. GC分代回收机制:

    • GC分代回收机制(java8 HotSpot分代)
      在这里插入图片描述
    • 上图是JAVA8的HotSpot的分代策略
    • eden+S0+S1合起来称为年轻代(Young Generation),GC非常频繁
    • S0+S1 称为幸存区(Survivor Space)
    • Tenured称为老年代(Old Generation)
    • metasnace:元空间(存放不回收的东西)
年轻代(Young Generation):
  • Java应用在分配Java对象时,这些对象会被分配到年轻代堆空间中去
  • . 这个空间大多是小对象并且频繁回收
老年代(Old Generation):
  • 年轻代堆空间的长期存活对象会转移到(也许是永久性转移)年老代堆空间
  • 这个堆空间通常比年轻代的堆空间大,并且其空间增长速度较缓
持久代(metasnace):JDK8之后叫元空间
  • 存放JVM和Java类的元数据(metadata),以及interned字符串和类的静态变量

GC的回收过程:刚开始对象都会被分配到年轻代中,在年轻代中的对象会被进行计数,被频繁使用的对象会被调到幸存区(S0,S1)中,当对象经历多次GC仍然没有被清理,该对象会被认为有一个较长的生命周期,从而被移到年老代中,当年老代中对象到达一定数量时会自动fullgc一次清理掉。当然堆的大小都是可以修改的,结合当前机器的资源修改。
GC频率:当内存达到一定阈值的时候,触发阈值后自动回收(内存小很快到达阈值就会触发GC,内存大,需要很久才达到阈值)

Tips:eden被GC,如果没有被回收掉(进程还没释放,还有守护线程),就+1次,最高15之后被放到S0或S1继续GC,S0和S1互斥,eden要么分给SO,要么分S1,同样如果在S0或S1没有被GC掉,达到15次就会进入Tenured(老年代),到了老年代就不怎么GC或者GC很慢很慢

四、内存回收策略

  1. 回收策略:Mark-Sweep 标记清除,copying算法,Mark-Compact 标记压缩

    内存回收策略优点缺点
    Mark-Sweep 标记清除清除较快删除时会产生碎片,不够放大对象
    copying算法清理的同时进行整理,可以存放大对象浪费一半的空间
    Mark-Compact 标记压缩标记的时候进行整理,可以存放大对象速度慢,效率较低
  2. Mark-Sweep 标记清除如下图:适合老年代(只管回收,不管整理)
    在这里插入图片描述
    Tips:例如餐厅吃饭有空余的桌子空出来了,未使用的空间腾出来了,不做整理,只做标记

  3. copying算法 如下图:适合年轻代,S0和S1(浪费空间),如图要么使用上面一半,要么使用下面一半
    要么使用S0,要么使用S1,不会两个都用
    在这里插入图片描述

  4. Mark-Compact 标记压缩:JC不频繁,适合老年代
    在这里插入图片描述

Tips:
了解JAVA自己的回收机制,更有助于压测,内存如果不用了需要回收释放掉,如果不释放,就会报内存溢出
堆内存:先进先出(例如:进餐厅吃饭,先来的吃完先走)
栈内存:先进后出(例如:有一叠盘子,先放在最下面的最后使用)

五、查看项目使用的jdk版本

  1. 命令:java -version
    在这里插入图片描述
  2. 通过tomcat项目内查看
    进入到tomcat的bin目录下:cd /usr/local/tomcat7-8083/bin
    执行如下:./version.sh
    在这里插入图片描述
  3. 还可以通过tomcat的bin目录下的配置文件查看
    执行命令:cat catalina.sh
    在这里插入图片描述
  4. 设置如下
    在这里插入图片描述
    Xms 起始堆内存
    Xmx 最大堆内存
    PermSize 永久代,在1.8之后称之为元空间
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat7-8083/bin/dushi.hprof
    如果出现内存溢出,在对应的路径生成一个hprof文件
    -XX:NewRatio=2 新生代和老年代的比例(不写默认1:2),2代表年轻代占1,老年代占2

六:JVM性能监测工具visualvm安装及配置

  1. 下载地址 https://visualvm.github.io/download.html
    JDK1.8之前自带JvisualVM,不需要下载,直接使用.在java的bin目录下,可以找到JvisualVM.exe
    JDK比较新的版本,不自带这个工具,那么需要下载并安装.工具的名字也变为了VisualVM
    默认在C盘:C:\Program Files\Java\jdk1.8.0_211\bin

  2. 双击打开,如果需要监控GC,那么要配置一个GC插件,工具→插件→可用插件,选择visual GC,点击左下角的安装
    如果自行安装的版本,需要在运行之前进行配置,进入viusalvm的etc目录,打开visualvm.conf,在大约72行的位置添加一行jdk的路径:visualvm_jdkhome=“你的jdk的路径”
    在这里插入图片描述

  3. JVM性能监测工具visualvm远程连接服务器的两种方式

    1. JMX方式连接(这种方式没有GC监控),能看线程死锁
      复制一个catalina-jmx-remote.jar到tomcat服务器的/usr/local/tomcat7-8083/lib然后重启tomcat,就可以连接上了,如果仍然不能连接,那么大多数情况是防火墙拒绝访问,此时可以关闭防火墙,或者将10001添加到白名单
      systemctl stop firewalld #关闭防火墙
      firewall-cmd --add-port=10001/tcp --permanent #将10001端口添加到白名单
      catalina-jmx-remote.jar:支持jmx方式连接的一个扩展包
      在这里插入图片描述
      在这里插入图片描述

    2. 进入 cd /usr/local/tomcat7-8083/bin,打开catlina.sh
      加入以下几句代码
      -Djava.rmi.server.hostname=192.168.197.132
      -Dcom.sun.management.jmxremote.port=10001
      -Dcom.sun.management.jmxremote.ssl=false
      -Dcom.sun.management.jmxremote.authenticate=false’

      -Djava.rmi.server.hostname=192.168.197.160 填写你的都市商城的IP
      -Dcom.sun.management.jmxremote.port=10001 jmx的端口
      -Dcom.sun.management.jmxremote.ssl=false 不使用SSL连接
      -Dcom.sun.management.jmxremote.authenticate=false 不进行用户验证
      之后保存并退出
      在这里插入图片描述

      重启tomcat,就可以访问了

    3. jstatd方式连接(这种方式没有CPU监控)
      参考之前博客:JVisuaIVM监控Jstatd启动时报错

相关文章:

JVM和GC监控技术

一、监控技术简介 JVM是什么?项目里面有JVM吗?JVM跟Tomcat有什么关系?为什么需要去分析JVM? 1. JVM(全称:Java Virtual Machine),Java虚拟机 是Java程序运行的环境,它是一个虚构的计算机&…...

Android中级控件

文章目录 图形定制1.图形Drawable2.形状图像3.九宫格图片4.状态列表图形 选择按钮1.复选框CheckBox2.开关按钮Switch3.单选按钮 文本输入1.编辑框EditText2.焦点变更监听器3.文本变化监听器 对话框1.提醒对话框2.日期对话框DatePickerDialog3.时间对话框TimePickerDialog 图形定…...

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯(IM)系统和实时通信应用中,WebSocket作为一种高效的双向通信协议,得到了广泛应用。然而,在实际使用中,如何确保消息的可靠传输…...

生信初学者教程(二十二):Boruta+RF筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Boruta特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了Boruta结合 RF(Random Forest) 的方法,对差异基因(参考 @sec-different-limma) 进行了特征筛选。通过这种方法,能够从大…...

JVM Class类文件结构

国庆节快乐 2024年10月2日17:49:22 目录 前言 magic 数 文件版本 使用JClassLib观察class文件 一般信息 接口 常量池 字段 方法 常量池计数器 常量池 类型 CONSTANT_Methodref_info CONSTANT_Class_info 类型结构总表 访问标志 类索引, …...

解决 GitHub 文件大小限制的问题

要解决 GitHub 文件大小限制的问题,可以使用 Git Large File Storage (Git LFS)。以下是设置步骤: 安装 Git LFS: 对于 macOS:brew install git-lfs对于 Windows:从 Git LFS官网 下载并安装。 初始化 Git LFS&#xff…...

wordpress源码资源站整站打包32GB数据,含6.7W条资源数据

源码太大了,足足32gb,先分享给大家。新手建立资源站,直接用这个代码部署一下,数据就够用了。辅助简单做下seo,一个新站就OK了。 温馨提示:必须按照顺序安装 代码下载...

金融领域的人工智能——Palmyra-Fin 如何重新定义市场分析

引言 DigiOps与人工智能 正在改变全球各行各业,并带来新的创新和效率水平。人工智能已成为金融领域的强大工具,为市场分析、风险管理和决策带来了新方法。金融市场以复杂性和快速变化而闻名,人工智能处理大量数据并提供清晰、可操作的见解的…...

STL--string类

我们从这篇文章之后就正式开始学习STL的string,字面看起来是不是像C语言里面的字符串之类的处理方法,是的,C里面也是对字符串的一些处理函数,但是C有很多这样的函数,给大家推荐一个网站 ,这个网站是C的官网…...

iptables 的NDAT报错bash: 9000: command not forward

外网主机设置: iptables -t nat -A PREROUTING -d 192.168.3.51 -p tcp --dport 9000 -j DNAT --to-destination 192.168.3.61:22 本地shell连接: PS C:> ssh root192.168.3.51 9000 显示如下操作: PS C:> ssh root192.168.3.51 9000…...

快速了解:MySQL InnoDB和MyISAM的区别

目录 一、序言二、InnoDB和MyISAM对比1、InnoDB特性支持如下2、MyISAM特性支持如下 三、两者核心区别1、事务支持2、锁机制3、索引结构4、缓存机制5、故障恢复6、使用场景 一、序言 在MySQL 8.0中,InnoDB是默认的存储引擎。除了InnoDB,MySQL还支持其它的…...

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…...

【C++前缀和】2845. 统计趣味子数组的数目|2073

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2845. 统计趣味子数组的数目 难度分:2073 给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。 请你找出并统计数组…...

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …...

docker零基础入门教程

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码,那你应该很容易发现C/C开源项目存在的一个严重问题&#xff…...

【Java SE 题库】移除元素(暴力解法)--力扣

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺…...

linux文件编程_进程

1. 进程相关概念 面试中关于进程,应该会问的的几个问题: 1.1. 什么是程序,什么是进程,有什么区别? 程序是静态的概念,比如: 磁盘中生成的a.out文件,就叫做:程序进程是…...

java NIO实现UDP通讯

NIO Udp通讯工具类 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Iterator;impo…...

ffmpeg如何实现视频推流?

FFmpeg是一个强大的多媒体框架,用于处理视频和音频数据。它包括了libavcodec(用于解码和编码)、libavformat(用于格式转换)、libavutil(提供一些辅助工具和函数)、libavfilter(用于音视频过滤)等多个库。 以下这些都是FFmpeg的特性 FFmpeg支持大量的音视频编解码器&…...

【HTML5】html5开篇基础(3)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...

echarts实现3D柱状图(视觉层面)根据博主改编

https://blog.csdn.net/weixin_57798646/article/details/131067725 这是原贴 在这个基础上我需要实现 一根柱子 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf8"> </hea…...

【一篇文章理解Java中多级缓存的设计与实现】

文章目录 一.什么是多级缓存&#xff1f;1.本地缓存2.远程缓存3.缓存层级4.加载策略 二.适合/不适合的业务场景1.适合的业务场景2.不适合的业务场景 三.Redis与Caffine的对比1. 序列化2. 进程关系 四.各本地缓存性能测试对比报告(官方)五.本地缓存Caffine如何使用1. 引入maven依…...

OpenSource - 开源WAF_SamWaf

文章目录 PreSafeLine VS SamWaf开发初衷软件介绍架构界面主要功能 使用说明下载最新版本快速启动WindowsLinuxDocker 启动访问升级指南自动升级手动升级 在线文档 代码相关代码托管介绍和编译已测试支持的平台测试效果 安全策略问题反馈许可证书贡献代码 Pre Nginx - 集成Mod…...

旅游避坑指南

1.火车站旁白的小摊贩&#xff0c;还有周边的小饭店百分之百是黑店&#xff0c;不仅难吃要死而且巨黑&#xff01;&#xff01;&#xff01; 可以地图上搜索附近的大型商超&#xff0c;例如泰安市的银座商超&#xff0c;里面的东西不仅好吃而且价格透明&#xff0c;还有很多当…...

矩阵系统源码搭建的具体步骤,支持oem,源码搭建

一、前期准备 明确需求 确定矩阵系统的具体用途&#xff0c;例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块&#xff0c;如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言&#xff0c;如 Python、Java、Node.js 等。确定数据库类型&…...

正则表达式调试工具实战

正则表达式调试工具实战 1、新建工程QWidget工程工程名RegexTool 如果QT不会配置,请参考我的博客,QT配置 Widget.cpp 默认内容如下 2、主界面设计 三行两列,每行采用HBoxLayout作为行布局控件,内部一个Lable控件和一个TextEdit控件,采用VBoxLayout 控件包裹三个HBoxLa…...

SQL:函数以及约束

目录 介绍 函数 字符串函数 数值函数 日期函数 流程函数 约束 总结 介绍 说到函数我们都不陌生,在C,C,java等语言中都有库函数,我们在平时也是经常使用,函数就是一段代码,我们既可以自定义实现,又可以使用库里内置的函数;从来更加简洁方便的完成业务;同样的在SQL中也有…...

在Linux中将设备驱动的地址映射到用户空间

本期主题&#xff1a; MMU的简单介绍&#xff0c;以及如何实现设备地址映射到用户空间 往期链接&#xff1a; Linux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析Linux下如何操作寄存器&#xff08;用户空间、内核空间方法讲解&#xff09;…...

电脑自带dll修复在哪里,dll丢失的6种解决方法总结

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是dll文件丢失或损坏。当这些dll文件丢失或损坏时&#xff0c;可能会导致某些应用程序无法…...

k8s基于nfs创建storageClass

首先安装nfs #服务端安装 yum install -y nfs-utils rpcbind #客户端安装 yum install -y nfs-utils #启动服务 并设置开启启动 systemctl start rpcbind && systemctl enable rpcbind systemctl start nfs && systemctl enable nfs #创建共享目录 mkdir -p /…...

使用word做网站/磁力狗bt

OGG12C配置环境配置&#xff1a;安装数据库Oracle12c安装源端OGG&#xff1a;oggs PORT:7809安装目标端OGG&#xff1a;oggt PORT:7909源端和目标端地址&#xff1a;127.0.0.1源端数据库&#xff1a;-----修改源数据库配置&#xff1a;SQL> sqlplus / as sysdba;SQL>a…...

没有备案的网站怎么访问/网站推广优化排名教程

熔断 当某个服务调用慢或者有大量超时现象(过载)&#xff0c;系统停止后续针对该服务的调用而直接返回&#xff0c;直至情况好转才恢复调用。这通常是为防止造成整个系统故障而采取的一种保护措施&#xff0c;也称过载保护。很多时候刚开始&#xff0c;可能只是出现了局部小规…...

wordpress页面过期/seo优化网站词

文章目录 零、写在前面一、概念定义1、两个集合的并2、三个集合的并二、题目描述三、算法详解四、源码剖析五、推荐专栏六、习题练习零、写在前面 这是《算法零基础100讲》 专栏打卡学习的第 29 天了。如果觉得本专栏太贵无法承受,在博主主页添加博主好友,获取 付费专栏优惠券…...

wordpress读取其他数据库/seo综合查询站长工具关键词

17、isset、empty、is_null的区别 isset 判断变量是否定义或者是否为空 变量存在返回ture&#xff0c;否则返回false变量定义不赋值返回falseunset一个变量&#xff0c;返回false变量赋值为null&#xff0c;返回falseempty&#xff1a;判断变量的值是否为空&#xff0c;能转换为…...

audio player wordpress 使用方法/bt磁力种子

一、background-attachment属性在CSS中&#xff0c;使用背景附件属性background-attachment可以设置背景图像是随对象滚动还是固定不动。语法&#xff1a;background-attachment:scroll/fixed;说明&#xff1a;background-attachment 属性只有2个属性值。scroll表示背景图像随对…...

在香港建设黄色网站是否违法/免费的推文制作网站

原因是Protocol buffers协议多了以后后整个项目比较大&#xff0c;超过了idea的限制了&#xff0c;调节下配置就可以了。找到idea安装目录bin/idea.properties文件 idea.max.intellisense.filesize92500 #默认2500...