• TCMalloc


    1,释放速度控制

        在将一个Span删除掉的时候,会优先将它加入到normal队列中,这之后会尝试从normal队列中释放一部分同样大小的内存给系统。

        释放内存给系统的时候,tcmalloc使用了一个延时回收机制,如果这次一个page都没释放,那么默认要等1<<18个page(4k的page的话,是1GB)的释放请求之后才会真正做释放操作;如果这次释放了n个page,那么要等1000 * n 个page释放请求之后才会真正做释放操作,这个地方有个上限,上限是1<<20个page(4k的page的话,是4GB)。

        这样做的原因,可能是想积攒若干个连续的页再释放,因为反复向操作系统释放和申请内存是一个很重的操作。

    2,每个线程cache的大小

    默认情况下,每个线程的Cache上线是4MB:

    static const size_t kMaxThreadCacheSize = 4 << 20;

    每个线程的Cache下限是512KB

    static const size_t kMinThreadCacheSize = kMaxSize * 2;

    默认情况下,所有线程的Cache上限是32MB:

    static const size_t kDefaultOverallThreadCacheSize = 8u * kMaxThreadCacheSize;

    MallocExtension::GetStats的输出:

    MALLOC:     3966097008 ( 3782.4 MiB) Bytes in use by application

    MALLOC: +            0 (    0.0 MiB) Bytes in page heap freelist

    MALLOC: +     25925136 (   24.7 MiB) Bytes in central cache freelist

    MALLOC: +      8526848 (    8.1 MiB) Bytes in transfer cache freelist

    MALLOC: +     24049536 (   22.9 MiB) Bytes in thread cache freelists

    MALLOC: +     18952344 (   18.1 MiB) Bytes in malloc metadata

    MALLOC:   ------------

    MALLOC: =   4043550872 ( 3856.2 MiB) Actual memory used (physical + swap)

    MALLOC: +   8285011968 ( 7901.2 MiB) Bytes released to OS (aka unmapped)

    MALLOC:   ------------

    MALLOC: =  12328562840 (11757.4 MiB) Virtual address space used

    MALLOC:

    MALLOC:         107257              Spans in use

    MALLOC:             67              Thread heaps in use

    MALLOC:           8192              Tcmalloc page size

    各个数字的计算:

    1, Virtual address space used

        const uint64_t virtual_memory_used = (stats.pageheap.system_bytes  // pageheap通过TCMalloc_SystemAlloc分配的内存

                                                              + stats.metadata_bytes);  // tcmalloc元数据占用的内存

    stats.pageheap.system_bytes 内存只增不减,因为tcmalloc在内存不足时会优先利用madvise向OS释放的内存

    2,Actual memory used (physical + swap)

        const uint64_t physical_memory_used = (virtual_memory_used  

                                            - stats.pageheap.unmapped_bytes);  // 通过madvise向OS释放的内存

    Actual memory used 是指所有向系统申请的内存减去向系统释放的内存。

    3,Bytes in use by application:

    const uint64_t bytes_in_use_by_app = (physical_memory_used

                                            - stats.metadata_bytes  

                                            - stats.pageheap.free_bytes  // pageheap所有normal队列中的span长度之和

                                            - stats.central_bytes

                                            - stats.transfer_bytes

                                            - stats.thread_bytes);

    Bytes in use by application是指所有被应用使用的内存(所有物理内存减去所有Free list中的内存)。

    Unmapped Bytes的含义是那些已经通过madvise释放给操作系统,但是依然在returned链表上的span的长度之和。

  • 相关阅读:
    自我介绍
    第一学期第一周学习总结
    2020-2021-1 20201332杨赛 《信息安全专业导论》第一周学习总结
    自我介绍
    2020-2021-1 20201307 《信息安全专业导论》第2周学习总结
    师生关系
    教材快速浏览
    2020-2021-1 20201307 《信息安全专业导论》第一周学习总结
    自我介绍
    20201319《信息安全导论》第一周学习总结
  • 原文地址:https://www.cnblogs.com/cobbliu/p/11196745.html
Copyright © 2020-2023  润新知