---
title: "【内存】内存底层深入"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/memory-internals-deep-dive/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/Unity/【内存】内存底层深入.md"
content_hash: d8cd3ff8ec1b3fc012d882060e3cdff9c299386a614001683692693972a3f5fb
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 【内存】内存底层深入
> 创建时间：2021/7/2 12:59

## 【内存】内存底层深入

  * 【内存】内存底层深入
    * 基本知识
      * 物理内存的访问
      * 台式设备和移动设备内存架构差异
    * 内存分页
    * Unity
    * Ref

## 基本知识

### 物理内存的访问

CPU访问内存是一个慢速过程。
访问过程：先访问Cache，Cache包含L1，L2，L3，也就是一级缓存，二级缓存和三级缓存，若在这些缓存里全没找到我们要的数据，再去访问内存，接着会把找到的数据存放到Cache中，完成一次操作。

过多的Cache Miss就会导致大量的内存和Cache的IO交换，浪费大量时间。

> Unity ECS方案: 可以将存储在内存中的不连续数据，变为连续的数据，从而降低Cache Miss的概率。

### 台式设备和移动设备内存架构差异

  * 移动设备 **没有独立显卡** 。

  * 移动设备 **没有独立显存** ，内存和显存是同一块内存。

> 所以有可能我们游戏占用的内存并不大，但是依旧爆内存了，其实是因为显存分配不出来了。这种情况，我们可以去查看一下Log，例如Android会有一个 OpenGL Error：Out Of Memory。

  * 移动设备的CPU面积更小，因此会导致 **缓存级数更少** ，大小也更小，例如一般的台式机三级缓存可能有8-16M，而移动设备则只有2M左右。

## 内存分页

内存分页（IOS上大部分为16K/page）是内存管理的最小单位，当Unity需要申请内存的时候，都会以block的方式（若干个页）进行申请。如果某一页在若干次GC（IOS为8次）之后仍然为Empty的话，它就会被释放，实际的物理内存就会被还给物理内存。

## Unity

## Ref

<https://zhuanlan.zhihu.com/p/370467923>
<https://zhuanlan.zhihu.com/p/362941227>
