Day10-性能优化 & 自动内存管理 | 青训营笔记

50 阅读2分钟

“这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天”

1 性能优化

1.1 性能优化的层面

image.png

1.2 性能优化与软件质量

image.png

2 自动内存管理

  • 1、动态内存

    • 程序在运行时根据需求动态分配的内存,例如Malloc方法;
  • 2、自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存

    • 避免手动内存管理,专注于业务逻辑
    • 保证内存使用的正确性和安全性,
      • 例如C++中的重复释放内存(double-free problem)和引用已经释放的内存空间(use-after-free problem)
  • 3、三个任务

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

2.1 相关概念

  • GC(Garbage Collection)垃圾回收
  • 有三种GC,分别如下图所示,

  • 其中Concurrent GC的难点在于右上角图所示,在GC过程中,业务线程还在继续,可能有新的对象产生;

  • 此时需要讲已标记的对象指向的对象也标记上,不然就会被当作死亡对象清理掉;

Concurrent GC必须感知对象指向关系的改变! image.png

  • 评价GC算法
    • 1)安全性;
    • 2)吞吐率;(花在GC上的时间)
    • 3)暂停时间;
    • 4)内存开销;

image.png

2.2 追踪垃圾回收

  • 对象被回收的条件:指针指向关系不可达的对象;
  • 过程如下:
  • 1)标记根对象;
  • 2)标记:可达对象;
  • 3)清理:所有不可达对象

image.png

  • 1、清理过程有三种方式:
    • 1)copying GC;将存活对象复制到另外内存空间;
    • 2)mark-sweep GC;将死亡对象标记为可分配;
    • 3)mark-compact GC;移动并整理存活对象;

image.png

image.png

2.3 分代GC(Generational GC)

根据对象的声明周期,使用不同的标记和清理策略

image.png

image.png

2.4 引用计数

  • 缺点:
  • 1)因为要保证引用值的正确性,原子操作开销大;
  • 2)环形结构;
  • 3)内存开销(引用至所占内存);
  • 4)当一个链过大,回收内存时可能会引发暂停;

image.png