【青训营】性能优化和自动内存管理

news2024/11/17 21:48:51

本文整理自:第五届字节跳动青年训练营 后端组

什么是性能优化

提高软件系统处理能力,减少不必要消耗,充分利用计算机算力

image.png

  • 业务层优化
    • 针对特定场景和具体问题
    • 容易获得较大收益
  • 语言运行时优化
    • 面向全公司的优化,非特定场景
    • 解决更通用的性能问题
    • 考虑更多场景

在优化时需要根据数据驱动,比如使用自动化性能分析工具–pprof。依靠数据优化而非主观猜测,并且首先优化最大的瓶颈

性能优化时需要注意:

  • 软件质量至关重要
  • 保证接口稳定的情况下改进具体实现
  • 测试驱动:测试用例覆盖尽可能多的场景,方便回归
  • 文档:做了什么,没错什么,能达到什么效果
  • 隔离:通过选型控制是否开启优化
  • 可观测:必要的日志输出

一、自动内存管理

自动内存管理又称垃圾回收,由程序语言的运行时系统管理动态内存

  • 避免手动内存管理,专注于实现业务逻辑,不需要像C一样使用malloc和free函数管理内存
  • 保证内存使用的正确性和安全性,解决了double-free problem和use-after-free problem问题

自动内存管理的三个任务是:

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象内存空间

1.1 相关概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector: GC线程,找到存活对象,回收死亡对象空间

有以下分配算法

Serial GC算法:只有一个collector,mutator执行到一定位置需gc时,collector会中断mutator,转为执行collect的gc流程

Parallel GC算法:支持多个collectors同时回收的GC算法,也需要中断mutator

Concurrent GC:多个mutator和多个collector可以同时执行,也就是mutator不需要被中断。

image.png

  • 评价GC算法
    • 安全性:不能回收存活操作
    • 吞吐率:花在GC上的时间
    • 暂停时间:业务是否感知
    • 内存开销:GC元数据开销

垃圾回收主要是用两种方法

  • 追踪垃圾回收
  • 引用计数

1.2 追踪垃圾回收

对象被回收的条件:指针指向关系不可达的对象,分三步:

  1. 标记根对象

    • 将静态变量、全局变量、常量、线程栈等标记为存活
  2. 标记可达对象

    • 求指针指向关系的传递闭包:从根对象出发找到可达对象
  3. 清理不可达对象
    清理不可达对象有三种方法:

    • 将存活对象复制到另外的内存空间,然后将原来的内存空间全部回收(copying gc)
    • 将死亡对象的内存标记为可分配,下次需要分配新空间时直接使用这些空间(mark-sweep gc)
    • 移动并且整理存活对象,比如位于1、3、4、7的内存地址的对象是存活的,那么将他们移动到0、1、2、3,下次分配直接从4开始(mark-compact gc)

我们需要根据对象的生命周期,使用不同的标记和清理策略,首先,我们需要学习分代GC的相关内容

分代GC

分代GC引申自分代假说,分代假说指出:most objects die young。也就是很多对象分配出来后很快就不再使用了。每个对象的年龄指的是经历GC的次数,每一次GC都会将已经死亡的对象回收,如果一个对象经历了许多次GC都没有被回收,也就证明它是频繁被使用的。

年轻代:

  • 常规对象分配,一般分配后很快就死亡
  • 由于存活对象很少,可以采用copy collection
  • gc吞吐率高

老年代

  • 对象倾向于一直活着,反复复制开销大
  • 可以采用mark-sweep collection

于是,在设计GC的时候,会倾向于针对年轻的和老年的对象制定不同的GC策略,从而降低整体的内存开销。不同年龄的对象处于heap的不同区域

1.3 引用计数

每个对象都有一个与之关联的引用数目,对象只有当引用数大于0的时候是存活的。也就对象没有被引用的时候就会死亡。

优点是内存管理的操作被平摊在了程序执行过程中,在程序执行时就完成了回收,而不需要等gc线程来回收。内存管理也不需要了解runtime的实现细节

缺点:

  • 维护引用计数开销较大:通过原子操作保证对引用计数操作的原子性和可见性
  • 无法回收环形数据结构
  • 内存开销大:每个对象都需要引入额外内存空间存储引用计数
  • 回收内存时依旧可能引发暂停

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

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

相关文章

力扣55.跳跃游戏(比较简单)

文章目录力扣55.跳跃游戏(比较简单)题目描述算法思路代码实现力扣55.跳跃游戏(比较简单) 题目描述 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度…

Tailscale-搭建异地局域网开源版中文部署指南

目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越…

SQL注入之联合查询注入与报错注入

数据来源 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 SQL注入之联合查询 sql注入简单演示 1. 判断sq注入 2. 闭合然后爆列 3. 查看显示列 …

vue中实现后台系统权限管理的功能

一、前言 后台管理系统的权限控制对于前端来说是经常用到的知识点,也比较重要,最近梳理一下写成文章,方便以后查阅。 项目中实现菜单的动态权限控制使用到了两种技术,一种是Vue Router,另一种是vue3官方推荐使用的专属…

蓝桥杯嵌入式第十届学习记录

1:拷贝LCD工程代码作为模板2:注意放置代码得顺序3:注意公共头函数键盘4:串口配置出来方便dubug模式正常接收数据5:记得打定时器中断(去历程定时器里面寻找!)6:细节地方7;LCD每个位置…

[hive]数仓分层|用户纬度拉链表|维度建模

https://www.modb.pro/404?redirect%2Fdb%2F241289一、数仓分层1、ODS层:原始数据层ODS(Ooriginal Ddata Sstore)1)设计要点存储来自多个业务系统、前端埋点、爬虫获取的一系列数据源的数据。我们要做三件事:【1】保持数据原貌不做任何修改,…

一阶高通滤波器学习

导读:本期文章主要介绍一阶高通滤波器。一阶高通滤波器与一阶低通滤波器很相似,都是利用电容阻低频信号通高频信号,电感阻高频信号通低频信号的特点。一、一阶高通滤波器介绍滤波器是作为一种选频装置,是信号处理中的一个重要的概…

Linux(二)进程概念

目录 一、冯诺依曼体系结构 二、操作系统 三、进程概念 1、程序与进程的区别: 2、cpu分时机制 3、pcb——进程控制块 4、进程是什么? 四、进程状态 1、linux状态 2、僵尸态 pid_t fork(void): fork创建进程之后,父子进…

vector以及list

之前已经学习过了string类,接下来介绍c中的另外两个类—— vector和list; vector 之前介绍的string类是c所特定的字符数组; 而vector可以看做是string类的扩展,因为它是一个模板类; 它可以作为任何类型的数组&#x…

小侃设计模式(廿二)-访问者模式

1.概述 访问者模式(Visitor Pattern)指的是在类的内部结构不变的情况下,不同的访问者访问这个对象都会呈现出不同的处理方式。它的主要作用时将数据结构与数据操作分离,将不同的算法与其所作用的对象进行分离。本文将详述访问者模…

DW动手学数据分析Task2:数据清洗及特征处理

文章目录一 数据清洗1 缺失值观察与处理1.1 缺失值观察1.2 缺失值处理2 重复值观察与处理二 特征处理1 分箱(离散化)处理2 对文本变量进行转换3 从纯文本Name特征里提取出Titles的特征3 参考文章一 数据清洗 数据清洗:我们拿到的数据通常是不…

树的知识概括锦囊(一)

作者:爱塔居 专栏:数据结构 作者简介:大三学生,希望跟大家一起进步! 文章目录 目录 文章目录 一、树形结构 二、树的基础知识 三、二叉树 3.1 概念 3.2 特殊的二叉树 ​编辑 3.3 二叉树的性质 四、习题挑战 一、树形结…

手把手教你学51单片机-如何学习单片机

大多数大学生之所以最后变的平庸,不是因为脑子多么笨,也不是全怪自己贪玩不上进,只是没有一个好的领路人,许多学校可能挂着导师的名头,但是多数是挂羊头卖狗肉或者是干脆不管。最后等大学生毕业之后,那些所谓的老师就会说学生很差或者学习很差,反正就是跟自己没啥关系。…

OSPF综合实验(华为)

题目: 思路: 首先配置每个区域的路由和环回地址,其次,根据题目要求打通每个网络的连接,区域0用MGRE打通网络,区域4需要重发布,其次再考虑优化的问题。ip地址的规划是为了更好的路由汇总&#x…

《 Unity Shader 入门精要》第5章 开始 Unity Shader 学习之旅

第5章 开始 Unity Shader 学习之旅 5.2 一个最简单的顶点/片元着色器 顶点/片元着色器的基本结构 // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)// 定义 shader 的名字 Shader "Chapter 5/Simple Shader" {SubShader{Pass {//…

自动驾驶控制算法之车辆横向控制(project)

本文为深蓝学院-自动驾驶控制与规划-第三章作业 目录 1 projection introduction 2 思路提示 2.1 ComputeControlCmd 2.2 ComputeLateralErrors 3 Corer Case 3.1 Low speed operation 3.2 Extra damping on heading 3.3 Steer into constant radius curve 4 ROSLGSV…

FFmpeg-4.2.4的filter: drawbox源码分析

1. vf_drawbox.c功能 有两个功能 ,添加方框,和添加网格; 1.1 添加方框效果 1.2 添加网格效果

c++数据结构-树(详细总结附代码,一看就懂)

树的定义一棵树是由n(n>0)个元素组成的有限集合,其中:(1)每个元素称为结点(node)(2)有一个特定的结点,称为根结点或树根(root&…

上海亚商投顾:双创指数低开高走,数字经济继续活跃

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日低开高走,创业板指午后涨超1%,科创50指数涨超1.6%。数字经济概念继续爆发&#…

算法基础(一):时间复杂度和空间复杂度

算法基础(一):时间复杂度和空间复杂度时间复杂度 O(1)O(1)O(1) O(N)O(N)O(N) O(logN)O(log N)O(logN) O(MN)O(MN)O(MN) O(NlogN)O(Nlog N)O(NlogN)、O(MlogN)O(Mlog N)O(MlogN) O(N2)O(N^2)O(N2)空间复杂度一些算法基础知识点和leetcode题解&…