`
isiqi
  • 浏览: 16590485 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

好的内存池-why可回收内存池

阅读更多

内存池相信都不陌生,实现的方法也有很多,简单的,复杂的,不一而足,网上也有很多现成的实现代码。

但大多有一个缺点,不可回收--也就是说刚开始那内存池分配的是多大,程序运行期间就一直那么大。

这种实现方式被大量的内存池实现所应用,比较简单,效率也比较高,但其还是有局限的。

大家可以试一下,当你在运行一个大的程序,该程序占据了大量的内存,此时你把它最小化,在windows任务管理器中,你会看到该程序的内存占用量剧减,其实并不是这先内存被释放了,是windows在背后做的小动作--windows把一些该程序不常用到的内存区间都写到磁盘上的pagefile中了。当程序被再次拉向前台时,该程序需要使用的内存就会再次从pagefile中装回来。如果这段内存量很大的话,而硬盘的读盘速度又不是很快,这时你就会明显的感觉到停滞感,甚至连键盘鼠标的响应都会延迟,这在打游戏的时候应该是很常见的。

所以,当你用不可回收的内存池申请了一块很大的区间时,你的程序可能已经用完了他,在内存池的记录中,该内存段也被标记为“可再次使用”,可是windows并不知道,它只知道用户申请了这样一块内存,并且始终不还给它。但是呢,这块内存的利用率又比较小,这时windows就回想,既然它不怎么被使用,那就把它写硬盘上吧。问题就来了....

当然,这种问题在内存池不是很大,使用率又很高的情况下是很微小的,但是如果在这样一种情况(也是笔者曾考虑过的情况):

1.内存池在程序中大量应用。

2.对内存区域分段,比如32字节以内的内存需求量分为一段,32·64一段,64·128一段.....

总的来说,这种方法也是挺好的,主要考虑到减小内存碎片。将差不多内存大小的放在一起,方便再次划分,提高索引效率等。

但也还是避免不了上面的问题,尤其是那种大型内存需求段的情况。

所以内存池使用还是需斟酌的,不可不用,不可滥用,关键是找出其中一个适合的量,可回收的内存池,也是要掌握一个量,经常的回收肯定不利于效率的提升,考虑平台,鉴戒前人经验,以及尽可能的实验的情况下就能尽量的找到这个度。

分享到:
评论

相关推荐

    What every programmer should know about memory

    2. **内存分配**:程序运行时,内存分配是必不可少的。了解堆(heap)和栈(stack)的区别,比如栈的快速分配与自动回收,以及堆的动态分配与手动管理,能避免内存泄漏和栈溢出问题。 3. **指针与引用**:理解指针...

    java应用性能内存调优

    良好的设计可以充分利用各种资源,如内存、CPU、缓存等,从而设计出高性能且可扩展性强的系统。改变原有设计以提高性能通常是困难的,因此,在编程开始之前就需要有清晰的设计模型和方法。 #### 四、程序性能瓶颈 ...

    Why Flutter Uses Dart – Hacker Noon.pdf

    1. AOT编译:Dart支持AOT(Ahead Of Time)编译,能够提前编译成快速、可预测的原生代码。这使得Flutter几乎所有的代码都可以用Dart编写。这样一来,不仅提高了Flutter的性能,同时也能够实现几乎所有方面的自定义...

    .net开源框架

    - **自动内存管理**:.NET框架采用垃圾回收机制,自动处理内存分配和释放,降低了内存泄漏的风险。 - **丰富的类库**:.NET框架提供了大量预先编写的类库,涵盖网络通信、数据库操作、图形界面等多个领域,极大地...

    Java通过What、Why、How了解弱引用

    即使有弱引用指向一个对象,只要没有任何其他强引用链可达该对象,垃圾收集器就会在下次GC时回收该对象。同时,弱引用对象会被放入创建时指定的引用队列,以便进一步处理。在Java中,除了弱引用,还有强引用、软引用...

    WHY_W9

    4. **内存管理**:Java有自动内存管理机制,包括垃圾回收(Garbage Collection),它自动清理不再使用的对象,避免内存泄漏。 5. **集合框架**:Java提供了丰富的集合类,如ArrayList、LinkedList、HashMap等,用于...

    Unix编程常见问题解答 高清PDF含书签目录

    - 进程的虚拟内存大小通常不会减小,因为操作系统会为进程分配连续的虚拟地址空间,即使进程释放了一些内存,这些地址空间也不会立即被回收。 - 但是,进程的驻留集大小(实际物理内存占用)可以减少,当进程不再...

    开源项目-golang-go.zip

    Go,也被称为Golang,是由Google开发的一种静态类型的、编译式的、垃圾回收的、并发型且具有C/C++风格语法的强类型系统编程语言。这个压缩包可能包含了Go项目的源代码,文档和其他相关资源,特别是"go-master"这一子...

    10分钟带你理解Java中的弱引用

    2. 软引用(Soft Reference):在内存不足时,软引用可达的对象才会被回收,比弱引用稍强。 3. 虚引用(Phantom Reference):最弱的引用,不能直接访问被引用的对象,仅在对象被回收后加入引用队列,用于记录回收...

    java面试宝典

    垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 12 39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类...

    115道java面试题

    垃圾收集器(Garbage Collector)是JVM中用来自动回收不再使用的对象的内存的组件,面试可能会问到不同的垃圾收集算法及其适用场景。 异常处理:异常处理是Java语言的重要特性之一,用于处理程序运行时可能出现的...

Global site tag (gtag.js) - Google Analytics