如何提升内存分配的效率
Contents
谈这个底层话题略显唐突,因为大部分开发者并不关心底层,内存分配依赖于各种工具提供的方法,底层具体怎么做的并不关心。如果你也这么想,那么在JVM配置最大内存为8G,并发近百个线程的情况下观察到Java进程占用内存远远超过8G分配内存。如果不了解底层你可能永远不知道为什么会这样。
大部分高级语言或多或少都与C语言有
一定关系,如Java,申请内存必须经过C库,C库为了加快内存分配速度,通过预分配更大的空间作为内存池。这样预先分配的6GB的C库内存池就与JVM中预先分配的8G内存池叠加在一起,造成Java进程内存占用超出预期。
了解内存池的好处
- 避免写程序时内存占用过大导致服务整体性能下降或者OOM的情况
- 加快内存分配速度(分布式环境下繁忙的多线程服务获取内存的时间可能会上升几十倍)
- 优化内存池技术应用在分布式环境可大大提升性能
如何提升内存分配速度
隐藏的内存池
在业务代码和系统内核间,往往有两层内存池被忽略,其中C库的内存池尤盛。当代码申请内存时请求首先到达应用内存池,如果内存应用池有足够的内存可以使用,那么就直接返回给业务代码,否则会向底层C库内存池申请。
Ptmalloc2
TCMalloc
如何选择Ptmalloc2和TCMalloc?
从堆还是栈上分配内存?
Author 聪少
LastMod 2020-06-24