java之jvm调优实战

news2024/9/29 1:18:00

在这里插入图片描述

我们今天是讲java虚拟机,我们刚学java的时候写过hellowWorld
我们通过javaC指令把java 文件编译成字节码文件(class)
最终通过我们jvm 将class文件运行在 windows和linux平台上
我们也都知道java 语言有个跨平台,对我们java程序来说我们写的一份Java代码 可以到处运行 windows/linux  

###java 虚拟机主要有 类加载子系统 运行时数据区 执行引擎
java--->class--->运行class文件 我们的jvm就开始工作了

在这里插入图片描述

java 虚拟机怎么跨平台, 就是jvm怎么帮我们实现跨平台
javac  编译成字节码(class)文件 再通过我们的java命令来运行他
运行Java指令 就代表java虚拟机开始工作了
首先会把字节码文件丢到java虚拟机第一个部分 ( 类装在子系统)
通过类加载子系统把我们的字节码文件丢到内存区域中(运行时数据区)
最终通过我们的字节码执行引擎来执行我们的代码
完整的java虚拟机由这 3快组成

在这里插入图片描述

最最重要的部分就是运行时数据区  我们后续的调优会围绕这里来说
内存区域(运行时数据区)内存区域用来存放数据的
运行时数据区由那些部分组成

堆 我们一般new	对象就放在堆中
栈 当我们执行main线程的时候,java虚拟机就会给这个线程在栈上分配一个空间用来放置我们线程运行过程中存储的局部变量
每个线程都有它自己专属的 栈内存空间,因为不同的线程都会有他自己的局部变量
程序只要一开始运行java虚拟机 就会给他分配一个专属的线程栈 用来放局部变量

在这里插入图片描述

栈中是有栈祯的,当主线程开始运行,给他分配一块 线程栈  当你运行方法的时候,他也会给方法在线程栈中划一小块空间,用来放方法自己的局部变量  
给每一个方法放置一块 自己方法的专属的内存空间 用来投放 abc 这些局部变量 叫做栈祯,
abc这些局部变量只会在comput方法内有效,当comput方法一结束,他的内存就会被销毁掉
一个方法就会对应一块栈祯内存区域,这些栈祯中用来放局部变量,方法自己的局部变量

在这里插入图片描述

线程运行jvm,会给他分配一个线程栈,线程要运行方法,jvm 会在这个线程栈中放一个main方法的栈祯
调用 computer的时候也会 分配一个栈祯,后调用的方法先结束
方法一旦结束 它里面的方法空间都会被释放掉
方法一结束 实际上就是出栈

先调用main 方法分配内存空间,后调用computer 方法后分配内存空间
但是 computer方法先执行完  出栈 销毁, 再执行mian方法 出栈销毁


程序计数器  每个线程私有的 代表当前线程正在运行的位置  
为什么要搞程序计数器呢,java程序是多线程的 假设我们的线程(没有抢到cpu)被挂起了,我们这个线程要想继续执行就得让抢占的线程结束了, 如果没有这个程序计数器 怎么知道恢复的时候在那行代码执行
 ##<<<<<<<我根据程序计数器的位置 我上次在这个位置  我这次在这个位置
这就是Java程序计数器的  初衷
线程切换的时候指导在那个位置来执行
jvm 的调优 以及arthas  调优工具

在这里插入图片描述

也就是我们程序计数器,当然是字节码执行引擎来操作并且修改的 
程序计数器的值 每执行一行代码,这个值都会变化,谁去修改字节码执行引擎
字节码执行引擎来执行程序(.class文件)然后再修改程序计数器
动态连接 无非就是吧符号引用转成直接引用

在这里插入图片描述

  https://www.jianshu.com/p/68721f23ee2b
new math 存储在堆中的
堆和栈的关系是,我栈里面的很多局部变量,假设其中的一部分局部变量他的值是一个对象类型对象分配到堆中
	方法区在jdk1.8之前叫做永久代,放的是什么东西,放的是常量,静态,类信息
 常量  
 static 

在这里插入图片描述

指针引用,根据方法区中的内存地址就可以定位到对象在堆中的地址
类信息 就是我们的类加载过来
本地方法栈,本地方法,native方法本地方法接口   存储的数据
new Thread().start他的实现是根据本地C实现的

在这里插入图片描述

假设是7*24 d的程序 会一直new 对象

垃圾收集 gc 
垃圾收集,字节码执行引擎操作的,当你的edit区满的时候
字节码执行引擎会在后台开启一个线程,来专门做垃圾收集
垃圾收集线程是 字节码执行引擎在 后台开启的  会专门负责垃圾收集

java 虚拟机垃圾收集的过程是怎么做的,到底是怎么收集垃圾的
gc的过程  gcRoot根节点
可达性分析算法

在这里插入图片描述

gc 垃圾收集过程 底层怎么找垃圾的  会运用一个算法 叫做 可达性分析算法
如果能找到的话 我们就认为这是一个非垃圾对象 
没有任何指针可以引用的对象就是垃圾,直接干掉,这就是gc底层大概的过程
就是我们的可达性分析算法,通过gcroot出发找到可达对象,可达对象被认为非垃圾对象
没有标记到的,我们认为是垃圾对象就把他干掉
20240325
gc 垃圾收集过程 底层怎么找垃圾的  会运用一个算法 叫做 可达性分析算法,
他会从所有的gc root 出发比如说math,找出gcroot 引用的对象

如果能找到的话 我们就认为这是一个非垃圾对象
没有任何指针可以引用的对象就是垃圾  直接干掉  这就是gc底层大概的过程
这就是我们可达性分析算法,通过gcroot 出发找到可达对象, 可达对象被认为是非垃圾对象的  没有找到的我们认为是垃圾对象 就会把他干掉

在这里插入图片描述

当edit园区满了的话 字节码执行引擎会在后台开启一个垃圾收集线程来专门做垃圾收集,edit 圆区满了 触发minorgc ,minorgc 会回收整个年轻代,对象经过一次minorgc 没有让干掉 他的分代年龄会+1 ,minorgc会回收年轻代垃圾,
对象在年轻代生命周期
一般来说 15 就会到年老代
我们思考下 平时工作中那些对象可能会最终变为老年代对象
什么类型的对象 最终会存放在老年代

静态变量引用的对象 包括spring容器中的bean
包括连接池 缓存池对象
###########>>>>>>>>>>>
因为他在程序运行中 一直都会存在, 每经过一次MinorGC 他都不会被干掉 
最终他就会分代年龄达到一定的值时候, 他就会 放到老年代
我们的一些调优包括线上问题怎么排查
对象在堆中生命周期的流转 大概是怎么做的
我们对象在年轻代的生命周期 ,每次加1  加到15的话  放到老年代
分代年龄在对象头中 比如说对象加锁

在这里插入图片描述

我们一些调优包括一些线上诊断问题怎么去做的
对象在堆的生命周期流转 的流程

在这里插入图片描述

这个程序一旦运行最终会内存溢出
最主要的对象 new HeapTest
因为按照可达性分析算法来说 new  HeapTest都是被Tests 直接或者间接引用着
最终肯定会有内存溢出 因为在我们程序运行中很多对象回收不了
########<<<<<<<<<
jvisualvm   jdk 的调优工具

在这里插入图片描述

他会找出我们本机所有的Jvm进程

在这里插入图片描述

edit源区在不断增长 增长到一定程度突然就没有了
没有  之后 老年代会增长
这个实际上就是我们的 程序在运行过程中 内存区域的变动情况
我程序运行他底层的执行过程,老年代不断增长  老年代放满之后 先做 FullGC
他会回收我们整个堆的对象  老年代 的对象 都是 被引用的,FullGC也没有用
释放不出空间, 只能内存溢出,也就是最终就会内存溢出

我们刚说了arthas工具  我们可以用阿里的arthas

在这里插入图片描述

java- jar 执行就好了
是用来监控你的java虚拟机的 jvm 的进程也就是说 你这台机器上的有一个jvm虚拟机在跑

执行java -jar 就可以看到你这个服务器上的jvm 进程

在这里插入图片描述
在这里插入图片描述

然后我们可以吧arthas工具 挂载在我们这个Java进程下,各个区域的内存情况,线程数  并且可以实时刷新的

在这里插入图片描述

比方说线程占用cpu 情况 这边有个线程占用cpu 达到98%了
 此时肯定有问题
#############>线上cpu .内存突然暴增 怎么定位
  用archars 只需要   thread 8 

在这里插入图片描述

在这里插入图片描述

就代表出现在我们代码的多少行,  他是一个死循环 一直在这里空转 当然cpu 消耗搞了
通过一系列的命令可以实现整个java虚拟机调优诊断的 功能
很多命令 可以帮我们调优诊断jvm 虚拟机线上运行的过程

在这里插入图片描述

代码发布在线上 可能依然存在  很多时候怀疑运维没有发布成功,jad 反编译 可以看到线上实际代码的情况

在这里插入图片描述

我基于jad 反编译线上正在运行的代码,线上正在运行的代码直接,反编译出来,就可以检查我代码是否有改动过

在这里插入图片描述

我就可以知道是运维没有发布成功还是我没有更改成功 ,arches 功能很强大
通过案例继续讲解调优,java虚拟机线上问题的诊断  定位问题  
java 虚拟机的调优 目的是为了干嘛  用各种命令找到线上的问题?
我们java虚拟机调优的目的是为了 干什么
我们java虚拟机调优的目的是为了减少FullGC
调优最大可能减少fullgc ,因为线上系统频繁fullGC 会对我们性能有影响
减少fullGC  
 只要我们java虚拟机在做Fullgc minotgc他都会停掉我们的用户线程  这个就叫做stw,
 
由用户发起的线程叫做用户线程 java ,虚拟机做底层 在做垃圾收集的时候
gc 线程的时候 会停止这个用户线程
停掉用户线程会有很大影响 意思是我用户在下单 突然做GC  如果GC 时间长的话
对用户的感知 很慢 突然会感觉网站会卡
GC 很频繁 对用户的感知,网址时不时就很卡,体验感就不好

减少FullGC, 甚至有时候要减少minor gc 最终我们调优的目的是减少stw的时间
让我们的网站更加流畅 用户几乎  不会说感知到太多的卡顿
在gc运行过程中,为什么要设置一个stw, 如果没有stw的话,程序在做gc的过程中,根据可达性分析算法就会去找垃圾, 我们程序就会一直会运行,假设gc没有结束,也就是说gc线程和用户线程在同步进行
gc线程没有结束 用户线程提前结束 -我gc 就会结束不了 因为以前不是垃圾  现在变成垃圾了


我GC 就结束不了了 ,就是因为这个过程我在GC 过程中,有可能用户的线程 在运行过程中可能会导致这个对象的状态发生了变化 所以Java虚拟机 在设计gc的过程中让用户线程停止 ,专心搞垃圾收集 可能效率还高一些 这就是stw机制
 我们碰到问题后 我们怎么对他进行分析调优,比如说我们平时系统运行还算正常,一旦到了流量稍微高一些 比如说大促活动, 我们就会发现我们的线上频繁FullGC  问题在哪里

在这里插入图片描述

  亿级流量电商网站
日活用户  ##怎么算  每天来访问我的用户,正常情况下,我可能早上1小时 中午1小时 下午2小时
也就是每秒几十单,但是在大促的时候不一样

大促的时候我就经常频繁发生FullGC基于这样的压力 我们就已经频繁fullGC le   对于这样的系统来说
怎么设置java虚拟机参数的 比如说堆内存
当然我们还得要最终压测 来进行评估
我们系统频繁触发Fullgc 怎么分析和评估
 怎么分析 可以根据这个系统的并发压力大致算算  我们的内存区域的使用情况

比如说我们搞了3个集群 也就是每一个节点300在大促下的并发,一个create下单方法 ,下单 createOrder(order) //  每秒300个订单生存丢到堆中去

按照一个对象1kb来说 每秒300个对象 300kb, 可能还涉及到主表 明细表 扩展表之类的

在这里插入图片描述

因为在下单过程中可能还有查询过程 比如说查询订单这些 所以我们的内存再扩大10倍
我每秒有6兆对象生成,你需要根据你的业务场景来分析你核心业务中的对象生成情况
我可能还有其他操作  ##>>>>.比如说订单查询系统  这些操作占用的内存 
按照我们核心业务以及  按照我们系统的核心业务以及压力情况
每秒大概60兆数据生成

在这里插入图片描述

我下完订单后 我的方法也就结束了,这些对象就会变成垃圾  就没有GCroot的引用了 就会变成垃圾
######<<  比如说我服务器4核8G  都是怎么设置我们Jvm虚拟机内存的  比方说堆内存 
根据系统的并发压力 可以分析他的内存使用情况 最终我们也要给我们的压测
年轻代有8:1:1
放满触发edit   每秒产生的对象 1s后变成垃圾对象

你的根据你系统的业务场景  每秒产生多少对象来评估你的堆内存参数,尽可能的减少FullGC
老年代满了,就会做FullGC, 老年代几分钟就放满了 执行一次FullGC  就会触发STW机制
根据程序的核心业务流程一些对象的使用  生成情况 合理的配比,java 虚拟机内存的各个部分 来规避FullGC 的产生

给我们这个系统java虚拟机调优让他几乎不发生FullGC,比方说mq kafka  都是运行在java虚拟机上 
kafka 单机承受10w+ 的系统
高性能mq 但性能怎么用  底层是有很多优化的
每秒有几百兆对象发到edit源区
对于单机想做高并发 你的jvm 参数一定要做设置 比如说你最起码的做大内存
就是说你想单机支撑 大并发的时候,你的单机器的jvm 内存就得放大一些,因为这样可以避免频发触发FullGC
比方说30G 的内存, 你minorGC 一次回收怎么都的几分钟  minorgc 回收过程中也会stw
呢么停顿个几秒种
在执行MinorGC 的时候 会STW  停止用户线程
在做STW的时候会有大量的超时 这样 客户端会有大量的报错
思考怎么调优    此时一定要借助于垃圾收集器
基于大内存的GC 该怎么来优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发掘非结构化数据价值:AI 在文档理解领域的现状与未来

编者按&#xff1a; 在当今这个由数据主导的时代&#xff0c;我们被海量多样的信息所环绕&#xff0c;但大部分数据都以非结构化的形式存在&#xff0c;诸如文档、电子邮件、合同等&#xff0c;这使得从中提取有价值的信息成为一大挑战。 幸运的是&#xff0c;AI 领域正在悄然孕…

负荷频率控制LFC,自抗扰ADRC控制,麻雀SSA算法优化自抗扰参数,两区域二次调频simulink/matlab

红色曲线为优化结果&#xff0c;蓝色曲线为没有自抗扰和没有优化的结果&#xff01;

JWT认证原理

简介&#xff1a; JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally …

用户下单、订单支付

一、用户下单 1.1 需求分析和设计 1.2 代码开发 1.2.1 Controller层 import com.sky.dto.OrdersSubmitDTO; import com.sky.result.Result; import com.sky.service.OrderService; import com.sky.vo.OrderSubmitVO; import io.swagger.annotations.Api; import io.swagger.a…

友商健康巡检分析

1、腾讯云 健康检查的参考资料&#xff1a;​​cloud.tencent.com​​ 检查的项目&#xff08;参数说明&#xff09; 检查类别 检查项 检查内容 资源状态 kube-apiserver 的状态 检测组件是否正在运行&#xff0c;如果组件以 Pod 形式运行&#xff0c;则检测其24小时内是…

《系统架构设计师教程(第2版)》第7章-系统架构设计基础知识-05-特定领域软件体系结构(DSSA)

文章目录 1. DSSA的定义1.1 概述1.2 DSSA 的必备特征如下 2. DSSA的基本活动2.1 领域分析2.2 领域设计2.3 领域实现 3. 参与DSSA的人员3.1 领域专家3.2 领域分析人员3.3 领域设计人员3.4 领域实现人员 4. DSSA的建立过程4.1 定义领域范围4.2 定义领域特定的元素4.3 定义领域特定…

[密码学] 密码学基础

目录 一 为什么要加密? 二 常见的密码算法 三 密钥 四 密码学常识 五 密码信息威胁 六 凯撒密码 一 为什么要加密? 在互联网的通信中&#xff0c;数据是通过很多计算机或者通信设备相互转发&#xff0c;才能够到达目的地,所以在这个转发的过程中&#xff0c;如果通信包…

安静:内向性格的竞争力 - 三余书屋 3ysw.net

精读文稿 这期我们介绍的这本书叫做《安静》&#xff0c;副标题是《内向性格的竞争力》。本书共有267页&#xff0c;我会用大约25分钟的时间为你讲述书中的精髓。内向性格具备什么样的竞争力&#xff1f;内向性格的人在人际交往和日常生活中似乎总是吃亏&#xff0c;因为他们不…

c语言知识点整理------基础c语言框架,数据类型,变量常量,注释

前言 本文不涉及讲解原理&#xff0c;用简洁明了的风格&#xff0c;去整理方便查阅的知识点。 &#xff08;适合有编程基础&#xff0c;或者需要作为笔记的人群使用&#xff09; 程序基本框架 结果会输出hello world。 程序的执行 c语言属于编译型语言。 代码执行分为五个…

python学习13:python中的字符串格式化

python中的字符串格式化另外一种方式 我们前面是使用的%d,%f,%s占位符来实现字符串的格式化的&#xff1b;这次我们通过f"{}"来快速实现格式化&#xff0c;代码示例如下&#xff1a;

计算机网络(二)物理层

物理层 一、通信基础1.奈氏准则、香农定理2.编码与调制3.电路交换、报文交换、分组交换 二、 传输介质、设备1.导向性传输介质&#xff1a;1.1双绞线1.2 同轴电缆1.3光纤 2.非导向性传输介质&#xff1a; 一、通信基础 信道带宽&#xff1a;信道能通过的最高频率和最低频率之差…

管理阿里云服务器ECS -- 网站选型和搭建

小云&#xff1a;我已经学会了如何登录云服务器ECS了&#xff0c;但是要如何搭建网站呢&#xff1f; 老王&#xff1a;目前有很多的个人网站系统软件&#xff0c;其中 WordPress 是使用非常广泛的一款&#xff0c;而且也可以把 WordPress 当作一个内容管理系统&#xff08;CMS…

739.每日温度

class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n len(temperatures)#从小到达&#xff0c;存放下标 把-1当作栈顶&#xff0c;0当作栈底index_stack [0]res [0] * nfor i in range(1,n):if temperatures[i] < temperatures[ind…

MSTP-3 8K/4K多业务综合光传输平台

MSTP-3作为全新的多业务综合光传输平台&#xff0c;是目前市场上少有的非插卡式、集中式最大32路4K多业务综合光传输产品&#xff0c;不但实现了自主知识产权和国产化替代&#xff0c;还填补了国内多通道8K/16K远距离光传输产品空白。 ⚫ 单套设备即可实现集中式多业务远距离光…

深入解析《企业级数据架构》:HDFS、Yarn、Hive、HBase与Spark的核心应用

写在前面 进入大数据阶段就意味着进入NoSQL阶段&#xff0c;更多的是面向OLAP场景&#xff0c;即数据仓库、BI应用等。 大数据技术的发展并不是偶然的&#xff0c;它的背后是对于成本的考量。集中式数据库或者基于MPP架构的分布数据库往往采用的都是性能稳定但价格较为昂贵的小…

2024年3月28日蚂蚁新村今日答案:人间能得几回闻和冰蚕吐凤雾绡空哪句诗描写的云锦之美?

蚂蚁新村是一个虚拟社区。在这个虚拟社区中&#xff0c;用户可以参与各种活动&#xff0c;比如生产能量豆、做慈善捐赠等。同时&#xff0c;蚂蚁新村也提供了一些知识问答环节&#xff0c;用户在参与的过程中可以增进知识。这些问答内容往往涉及广泛的主题&#xff0c;如文化、…

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点&#xff1a;缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法&#xff1a;1.使…

基于springboot实现校园管理系统项目【项目源码+论文说明】

基于springboot实现校园管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;校园管理系统当然也不能排除在外。校园管理系统是以实际运用为开发背景&#xff0c…

SQL107 将两个 SELECT 语句结合起来(二)(不用union,在where里用or)

select prod_id,quantity from OrderItems where quantity 100 or prod_id like BNBG% order by prod_id;在where子句里使用or

ABC346 A-G 题解

ABC346 A-G题解 A题目AC Code&#xff1a;时间复杂度 B题目时间复杂度AC Code&#xff1a; C题目时间复杂度AC Code&#xff1a; D题目时间复杂度AC Code&#xff1a; E题目时间复杂度AC Code&#xff1a; F题目时间复杂度AC Code&#xff1a; G题目时间复杂度AC Code&#xff…