性能分析--内存知识

内存相关知识

  • 计算机中与CPU进行数据交换的桥梁。内存的速度,比CPU的速度要慢很多。比磁盘速度要快很多。
  • 内存中存放数据,一旦断电就会消失。
  • linux系统的 /proc路径下的文件,都是内存文件。
  • 内存大小,一般 是GB为单位。 现在都操作系统是 64位,可以支持 几个T的内存
  • 服务器的内存: 常见 8g 16g 32g 64g
  • 内存: 内存地址 存储单元 两部分组成
  • 内存单元大小,不是固定。(一般8位)

存储单元

  • 简单数据类型可以指定长度
  • 有些数据类型不明确长度,不明确的长度存储单元,就有管理存储数据的数据结构。

列表的数据结构,索引位置,告诉你某个数据在列表的中的某个位置。列表,插入或删除一个数据, 在它的索引位置之后的所有数据,都得移动。 列表数据类型,在进行数据 插入、删除是比较慢的。

链表: 数据之间相互记录,构成一个数据链

链表插入数据、删除数据,速度比 列表要快,但是查询或获取数据的速度要比列表要慢

二叉树: 是一个链表

类、对象: 比较复杂的,数据要存放,不知道具体应该怎么存

堆:用于存放比较复杂的第数据

堆区: 连续一段地址空间,存放堆数据

栈stack区: 连续一段地址空间,来存放数据长度比较明确的数据

堆栈: 是两种数据结构。

栈stack区:LIFO ===Last In First Out 后进先出

  • 压栈 弹出

队queue列: FIFO ====FirstInFirstOut 先进先出

  • 顺序队列、 循环队列堆

内存: 有堆区和栈区。 每一个程序启动时候会申请一段内存空间,在自己申请的内存空间中,划 分出堆区和栈区

虚拟内存,是记录程序的内存中数据的区域的。

图解虚拟内存、物理内存、swap 分区的工作与管理

CPU对程序计算某个功能时候,就问虚拟内存,要xxx类型的数据应该到内存的哪个地方去获取。 虚拟内存就会返回结果给 CPU。CPU拿到这个地址之后就直接去内存条中,地址区间去取数据。

cpu从内存中,读数据,是以-页page-为单位。

php、python、go语言项目,没有强制现在项目的内存空间大小,所以一般不会有内存溢出问题,但 是并不是说,就没有内存问题。

内存溢出,只是内存问题中的一种。

内存泄露: 程序在运行过程中,某次请求申请了一段内存空间(从程序自己的内存空间中申请了一 段)使用,使用完成之后不释放,导致可用内存越来越少。

  • 可用的内存漏掉了。

内存溢出:经过一段时间的内存泄露之后,某次申请内存空间时,申请的空间大小,大于剩余可用空间,此时就内存溢出。

  • 性能角度来讲,不建议代码中使用递归。

怎么知识内存溢出了?

  • 1、观察程序的内存使用情况,完全几乎全部使用,肯定有内存溢出。
  • 2、内存溢出,不一定会报出错误。
    • 1、报错误: 日志中、直接发送给请求当作请求的响应

堆区: 新生代new、老年代Tenured、永久代Perm

  • new : Ø昙花一现,朝生夕死的对象 代码方法内部变量
    • eden区
    • from区
    • to区
  • Tenured: Ø大对象 or 多次被GC后还在的对象(顽固份子)

项目中新申请的资源都放在 new中, 使用之后判断策略,多次判断这个资源是否还用,如果还可以用,把这个资源 移动到Tenured。

YGC: 主要回收新生代的空间、回收频率高,每次收时间短

FGC: 主要回收老年代的空间、回收频率低,每次回收用到时间长

  • 还包括:回收新生代、元空间

总的GC回收时间,期望越短越好 = YGC时间 + FGC的时间

3650+1440 = 5090

52*40 + 2*5*60 = 2080+600 = 2680

GC是资源回收,一定要有的,期望回收总时间少的。 ygc和fgc的频率是关键.

这个就要反复测试出来而不是计算出来

  • 调整 新生代 与 老年代的 大小
    • 1、调整整个内存大小(调整YGC的回收频率)
    • 2、调整新生代老年代的配比(调整FGC的回收频率)

YGC 回收的时间 一般是小几十毫秒到小几百毫秒以内

FGC回收的时间,大几百毫秒甚至上秒

验证: 内存溢出、gc

配置参数

tomcat是部署java的一个中间件,springboot开发,自身就带有tomcat,springboot的项目,可以放到 tomcat中启动,也可以直接使用 java -jar xxx.jar

tomcat的bin文件夹中 catalina.sh 配置,配置内存信息(内容见下方)

tomcat的conf有 server.xml 配置 配置服务 协议、端口

tomcat的logs文件夹日志文件

tomcat的webapps文件夹 放项目

  • 项目打war包,自动可以解压

JAVA_OPTS=”-server -Xms512m -Xmx512m -Xmn128m -Xss256k -XX:PermSize=128m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename”

打印gc的配置,一般不在生成环境中添加。

server.xml中线程池的(保持的连接数,企业配置的数值都比较小)

配置 acceptCount: 能接收的队列长度,队列满了再有连接就会被拒绝(修改线程池)

tomcat

配置文件:  

  •  bin文件夹下: catalina.sh        
    • 配置堆栈信息    
  • conf 文件夹下 : server.xml文件      
    • 服务、线程池信息

实战

tomcat + java项目 可以配置  catalina.sh  堆栈信息,也可以不配

有内存溢出的问题,堆栈信息配置,配大一些,也只是 内存溢出的时间  延后一点。

环境要求: jre\jdk8

上传 tomcat的包、JvmPertest.war包服务器上

解压 tomcat, JvmPertest.war包丢到  tomcat的webapps文件夹下

配置 catalina.sh文件

启动tomcat

测试

使用jmeter调用   http://ip:8080/JvmPertest/pertest1

去logs查看日志

调用jmeter脚本一段时间持续运行 

日志如下(在日志信息中不一定会出现错误信息):

发现响应出错了,錯誤信息中,:

nested exception is java.lang.OutOfMemoryError: Java heap space

定位

已经出现了内存溢出问题, 下一次测试的时候,要重启项目(注意内存溢出会可能会导致无法停止项目,需要杀掉进程重启项目

安装arthas

curl -O https://arthas.aliyun.com/math-game.jar

启动arthas 

java -jar math-game.jar

把arthas 连接到  java进程上

使用jmeter进行性能测试, 测试时发现有内存溢出的问题的时候,我们在arthas中执行    heapdump 就会在很短时间内存 把内存新的信息dump下来,生成一个hprof文件,放在tomcat的temp文件夹中。 把hprof的文件下载下来,然后使用MAT(MemoryAnalyzer)工具打开。 做java开发,编辑器是可以去安装 这个 插件

1、我们已经获取到   内存溢出时的堆栈信息 hprof文件,  这个文件可以直接给开发人员,让他们去 定位具体问题  -----对于没有java基础

2、你想分析定位具体问题,使用mat(MemoryAnalyzer)工具,打开 hprof文件,进一步分析。

假设性能测试服务是一个集群,对这个集群大服务,进行性能测试时,发现了内存溢出,集群是由多个服务构成的,怎么来获取堆栈信息?

  • 1、首先判断出现内存溢出的服务是哪个?
    • 1、 集群中,所有的服务的日志看一遍  ===== 内存溢出,日志可能有错误信息。        
      • 有内存溢出的日志在服务上,肯定这个服务就内存溢出了,此时就获取这个服务所在的机器的堆 栈信息就可以了。
  • 2、看java进程的内存使用情况。 内存几乎都用完了  --------就是这个了

仅仅只是加大服务的内存,是不一定能解决  内存溢出问题。 为什么内存溢出,是申请了内存没有释放,导致内存泄露,然后时间久了就内存溢出。

内存回收,也是可能导致内存溢出的一种原因。

内存的释放,就与GC有关系。  调整内存的参数配比, 是不是就会改变GC频率。  ----把新生代 调大,老年代调小。(前提内存总大小没有变)

确认是否有效?

就会打印 gc日志(gc.log),通过分析gc日志来判断是否有效。

有了gc日志,可以使用 gceasy.io网站  

可以把gc的日志文件给开发人员,让他们去分析

也可以 把gc分析报告 https://gceasy.io/my-gc-report.jsp? p=c2hhcmVkLzIwMjMvMDMvMjQvZ2MubG9nLS0xMy0zMi0zNw==&channel=WEB 给开发人员

监控

也可以来监控  内存使用情况 grafana + Prometheus + jvm_exporter

操作jvm_exporter和tomcat.yml上传到 被监控的服务上   (https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent 中,选择你要 下载到文件)

tomcat.yml文件   ----里面的东西不要动

修改 tomcat的catalina.sh文件: 

 JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent0.14.0.jar=3088:./tomcat.yml"

(路径:javaagent和包名:jmx_prometheus_javaagent0.14.0.jar要写正确,端口按需更改)

hosts文件中没有主机名的,需要要改一下。  ------如果不改,网络延迟可能很长,导致监控平台这边不显示数据。

引入模板: 8563    注意的 job的填写,要是  Prometheus.yml中写的 job_name

模板3517,没数据需要写入对应的ip和端口号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 导出jar无法执行 错误: 找不到或无法加载主类

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里,尽管添加到Modules里依然可以测试运行或调试,但导出的jar包会遇到问题。 2、导出jar,方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

OpenCV 使用freetype在图像上写中文

​​​​​​ #include "opencv2/opencv.hpp" #include "opencv2/freetype.hpp"static cv::Ptr<cv::freetype::FreeType2> getFreeType() {static cv::Ptr<cv::freetype::FreeType2> ft2;if (ft2.empty()){ft2 cv::freetype::createFreeType…

说说虚拟化上部署Oracle RAC的那点注意事项

0.概述 目前在虚拟化上部署RAC主要是以下3个场景 1是VMWARE的虚拟化&#xff08;私有云&#xff09;&#xff1b; 2是国产厂商基于KVM的虚拟化&#xff08;私有云&#xff09;&#xff1b; 3是公有云&#xff0c;由云厂商给你提供虚拟主机和虚拟磁盘。 这里我只对前2个熟悉一些…

政安晨:【Keras机器学习实践要点】(二十)—— 使用现代 MLP 模型进行图像分类

目录 简介 设置 准备数据 配置超参数 建立分类模型 定义实验 使用数据增强 将补丁提取作为一个图层来实施 将位置嵌入作为一个图层来实施 MLP 混频器模型 FNet 模式 gMLP 模式 实施 gMLP 模块 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐…

移动平台相关(安卓)

目录 安卓开发 Unity打包安卓 ​编辑​编辑 BuildSettings PlayerSettings OtherSettings 身份证明 配置 脚本编译 优化 PublishingSettings 调试 ReMote Android Logcat AndroidStudio的调试 Java语法 ​编辑​编辑​编辑 变量 运算符 ​编辑​编辑​编辑​…

基于JSP SSM的社区生活超市管理系统

目录 背景 技术简介 系统简介 界面预览 背景 随着时代步伐的加速&#xff0c;计算机技术已广泛而深刻地渗透到社会的各个层面。随着居民生活水平的持续提升&#xff0c;人们对社区生活超市的期望和管理要求也越来越高。随着社区生活超市数量的稳步增长&#xff0c;开发一个…

162 Linux C++ 通讯架构实战16,UDP/TCP协议的优缺点,使用环境对比。UDP 服务器开发

UDP/TCP协议的优缺点 TCP :面向连接的&#xff0c;可靠数据包传输。对于不稳定的网络层&#xff0c;采取完全弥补的通信方式。丢包重传 优点&#xff1a;稳定&#xff0c;数据流量稳定&#xff0c;速度稳定&#xff0c;顺序稳定 缺点&#xff1a;传输速度慢&…

【C语言】_文件类型,结束判定与文件缓冲区

目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被称为文本文件或二进制文件&#xff1b; 数据在内存中以二进制的形式存储&#xff0c;如果不加转换地输出到外存&#xff0c;就是二进…

2024年最新版本的开源TwoNav网址导航系统源码 免授权

TwoNav 是一款新鲜发布的开源解密版书签&#xff08;导航&#xff09;管理程序。该程序采用PHP SQLite 3进行开发&#xff0c;具有界面简洁、安装简单、使用方便等特点&#xff0c;基础功能免费提供。TwoNav可以帮助用户集中管理浏览器书签&#xff0c;解决跨设备、跨平台和跨…

Text-Driven Object Detection 关于结合文本的目标检测

1、简单介绍 首先说明&#xff0c;本文目的主要是水一篇CSDN博客&#xff0c;顺便说一下和标题相关的认识。 近几年&#xff0c;在目标检测领域关于多模态的目标检测工作已成了主流&#xff0c;趋势仍在延续&#xff0c;未来仍有很大挖掘空间。这里说的多模态不是简单的多源数…

03-JAVA设计模式-建造者模式

建造者模式 什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种对象构建的设计模式&#xff0c;它允许你通过一步一步地构建一个复杂对象&#xff0c;来隐藏复杂对象的创建细节。 这种模式将一个复杂对象的构建过程与其表示过程分离&#xff0c;使得…

Linux 线程:使用管理线程、多线程、分离线程

目录 一、使用线程 1、pthread_create创建线程 2、pthread_join等待线程 主线程获取新线程退出结果 获取新线程退出返回的数组 3、线程异常导致进程终止 4、pthread_exit 5、pthread_cancel 6、主线程可以取消新线程&#xff0c;新线程可以取消主线程吗 二、如何管理线…

vivado中移位寄存器的优化(二)

移位寄存器优化用于改善移位寄存器单元&#xff08;SRLs&#xff09;与其他逻辑单元之间的负裕量路径的时序。如果存在对移位寄存器单元&#xff08;SRL16E或SRLC32E&#xff09;的时序违规&#xff0c;优化会从SRL寄存器链的开始或结束位置提取一个寄存器&#xff0c;并将其放…

linux学习:gcc编译

编译.c gcc hello.c -o hello 用gcc 这个工具编译 hello.c&#xff0c;并且使之生成一个二进制文件 hello。 其中 –o 的意义是 output&#xff0c;指明要生成的文件的名称&#xff0c;如果不写 –o hello 的话会生成默 认的一个 a.out 文件 获得 C 源程序经过预处理之后的文…

【深度学习】StableDiffusion的组件解析,运行一些基础组件效果

文章目录 前言vaeclipUNetunet训练帮助、问询 前言 看了篇文&#xff1a; https://zhuanlan.zhihu.com/p/617134893 运行一些组件试试效果。 vae 代码&#xff1a; import torch from diffusers import AutoencoderKL import numpy as np from PIL import Image# 加载模型…

【Redis 知识储备】读写分离/主从分离架构 -- 分布系统的演进(4)

读写分离/主从分离架构 简介出现原因架构工作原理技术案例架构优缺点 简介 将数据库读写操作分散到不同的节点上, 数据库服务器搭建主从集群, 一主一从, 一主多从都可以, 数据库主机负责写操作, 从机只负责读操作 出现原因 数据库成为瓶颈, 而互联网应用一般读多写少, 数据库…

zdpdjango_argonadmin Django后台管理系统中的常见功能开发

效果预览 首先&#xff0c;看一下这个项目最开始的样子&#xff1a; 左侧优化 将左侧优化为下面的样子&#xff1a; 代码位置&#xff1a; 代码如下&#xff1a; {% load i18n static admin_argon %}<aside class"sidenav bg-white navbar navbar-vertical na…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十四篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

2024/4/1—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…