`
java-mans
  • 浏览: 11738416 次
文章分类
社区版块
存档分类
最新评论

自动归还的对象池--一个并不美丽的传说

 
阅读更多

自动归还的对象池--一个并不美丽的传说


有一个美丽的传说,精美的石头它会唱歌........
多么令人神往的事啊(不用买MP3了),既然连石头都会唱歌,于是太多的传说诞生了.

程序员杂志第十一期上,发表了一篇题为<<自动归还的对象池>>,作者为我们描述了一个美妙的
可以自动归还的对象池,让每一个痛苦于垃圾回收的程序员带来了心动的向往.

但传说真的会成为现实吗?

通读全篇,没有发现一行示意性的实现代码,所有代码片断只是示意了获取可回收对象的原理性
机制,比如我要向大家介绍一种高性能的httpserver,然后我告诉你:

ServerSocket sc = new ServerSocket(80);
这样就可以在80口上监听http请求连结.

知道写ServerSocket sc = new ServerSocket(80);连入门者都可以,可以写出能实际应用的
webserver的有几个人?把传说变为现实,我不客气地说一句,恐怕作者自己也只是一个梦想.

这不是重要的,因为毕竟有人能把传说成为现实,要不我们哪有weblogic,resin,tomcat("逻列
不超三"是一个道德)可用,但可以成为现实的传说并不都是美丽的.


java是面向对象的思想,对java编程的过程就是对自然的认识过程.自然界生死轮回,各循其道.
有生有死,才使整个世界不仅能正常运转,而且生生不息,假如现在有一种不死术(这不仅是每个
程序员在向往了),那一百年之后,整眼看去每个人都是耄耋之态,那还叫什么世界?

每个java对象都有它的生存期限,一个对象的生命周期不仅仅是受JVM管理,它还有受作业系统.
协议规范的限制.作者在他的美文中一直以Connection对象作为说明,我们也以Connection对象
来看看传说对它来说并不是美丽的.

我们知道,真实的连结池都实现了收缩功能,也就是在一定的周期内如果连结闲置超过
一定的时间,我们就销毁它,在需要的时候再产生新的Connection,正是这样生死有道才能使连结
池正常地工作.
而如果传说成了现实,Connection成了不死之物.那么在空闲的时候,它也要一直和数据库
连着,而一个数据库所能连结的数量是受限的.这样当这个应用没有需求的时候,其它应用也不能
有太多的连结机会.Connecion就如汽车,你一次申请了40辆,不管用不用,都一直这么占着,其它人别
想用.而实际的连结池是如果我只需要10辆我就先交还30辆,当我需要的时候再申请.所以及时让
Connecion死亡,让其它应用有建立连结的机会是一个有道德的程序员都应遵循的原则.而不是不
管是否需要都一直让Connection都活着.

另一方面,如果对象超过了它的生命周期,即使强行让他活着,那也只是行尸走肉,没有
生命力的对象为什么要强行让他生存?该走入历史的垃圾堆,说明它已经完成了它的使命,强行把
它们从垃圾堆中回收出来重用,幽灵复活那种可怕的情景大家在屏幕上都看到过吧?

还是以Connection来说明(原作者一直以这个对象来说明的),它的生命周期不仅仅被
JVM管理,而且它还受TCP协议约束,如果被收缩的Connection硬从垃圾堆中回收回来,我们看它会
出如何?如果这个Connection长时间闲置没有和数据库的交互,虽然从作为JVM来说它可以垃圾回
收器中重新找回来,但在协议层,数据库服务端因为Socket连结本身闲置超时,而挂起对它的响应.
这时再通过它执行Command,"Connection reset by peer:socket writ",一个虽然存活但没有生
命力的东西(纯蛋白质).

大千世界,生死有道,不可强行,以前中国人就是太天真地以为"人定胜天",才会在不产
煤的山上强行挖坑.改变自然的恶果我们已经预见或可以看到,就是在毁灭人类自己,适应自然,
保护自然,那才是真正美丽的传说.

分享到:
评论

相关推荐

    Java对象池技术的原理及其实现

    通过对对象池技术核心概念——缓存与共享的阐述,本文不仅介绍了对象池的基本工作原理,还详细讲解了构建一个通用对象池所需的关键类及其功能。此外,文章还讨论了使用对象池技术时应注意的问题。 #### 关键词 - ...

    对象池的一个小例子

    对象池通过预先创建一定数量的对象并存储在一个池中,当应用程序需要使用这些对象时,可以直接从池中获取而无需重新创建;当使用完毕后,再将对象归还到池中供后续使用,而不是直接销毁。 #### 三、对象池的优点 1...

    deePool高效的JavaScript对象池

    5. 销毁对象池:在不再需要对象池时,使用`pool.destroy()`清理所有对象并释放资源。 ### 总结 DeePool通过实现JavaScript对象池,为开发者提供了一种优化内存使用、提高程序运行效率的有效手段。尤其在需要大量...

    Go-一个通用的golang对象池

    对象池的基本思想是预先创建一定数量的对象,并存储在一个池中,当程序需要使用对象时,可以从池中获取,用完后再归还,而不是每次都需要创建新的对象。这样不仅能减少系统调用的开销,还能避免因频繁创建和销毁对象...

    unity对象池的案例Demo

    4. **对象分配**:当需要新对象时,从池中取出一个未使用的对象并激活。如果池已空,可以选择实例化新的对象,或者等待其他对象归还。 5. **对象回收**:当对象不再需要时,将其设为不可见或非活动状态,然后返回到...

    工厂设计模式附加对象池说明

    对象池是一种资源管理技术,用于预先创建一组对象并存储在一个“池”中,当需要对象时,可以从池中获取,而不是每次需要时都创建新的对象。这样可以显著减少对象的创建和销毁开销,尤其是在创建对象成本高或者系统...

    C++对象内存池 ---- C++侦探改写.rar

    本资源"ObjPool.h"可能是一个实现了C++对象内存池的头文件,由"C++侦探改写",可能是对原内存池实现的分析和改进。下面我们将深入探讨C++对象内存池的原理、设计以及可能的优化策略。 内存池的基本思想是预先分配一...

    UE4 Actor对象池插件

    1. **对象预分配**:预先创建一定数量的对象并保存在池中,避免运行时动态创建。 2. **对象复用**:当对象不再需要时,不是销毁,而是返回到池中等待下次使用。 3. **对象池大小管理**:根据游戏运行状态动态调整池...

    Java对象池实现源码

    1. 初始化:预创建一定数量的对象并存储在池中。 2. 分配:当应用程序需要对象时,从池中获取一个空闲对象,而不是创建新对象。 3. 归还:使用完对象后,不是立即销毁,而是归还到对象池,供后续使用。 4. 监控与...

    C#自定义对象池

    这个类通常包含一个队列或字典来保存对象,以及一些方法如获取对象、归还对象等。以下是一个简单的对象池实现框架: ```csharp public class ObjectPool&lt;T&gt; where T : class, new() { private Queue&lt;T&gt; _object...

    关于java对象池的例子代码

    对象池是一种池化数据结构,它预先创建了一组对象,并将它们保存在一个集合中。当需要一个新对象时,程序可以从池中获取一个已存在的对象,而不是创建一个新的。使用完毕后,对象不被销毁,而是放回池中供后续使用。...

    对象池简单Demo(资源包)

    对象池是一种内存管理策略,通过预先创建一组对象并保持在内存中,而不是每次需要时都创建新的对象。当对象不再使用时,不是将其销毁,而是将它放回池中供后续使用。这种方式减少了垃圾回收的压力,提高了程序运行...

    对象池

    3. **获取对象**:当需要对象时,首先检查池中是否有空闲对象,如果有则返回,否则创建新的对象并添加到池中。 4. **归还对象**:使用完对象后,不应直接删除,而是将其归还给对象池,以便后续再次使用。 5. **对象...

    用Dictionary写的对象池

    对象池是一种在软件开发中用于优化资源管理的技术,它的核心思想是预先创建并维护一组对象,以便在需要时快速分配,而不是每次都新建对象。这种方式可以减少频繁创建和销毁对象带来的性能开销,尤其是在处理大量短...

    Unity对象池的理解和使用

    对于对象池的优化逻辑其实是见仁见智的,并不是随随便便就拿来用,其实很多时候我们并不需要通过对象池来处理,通过对象池的主要目的是: 防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)对象初始化...

    EasyObjectsPool(一个简单的Unity对象池插件)

    1.1 对象池原理:对象池机制类似于现实生活中的资源库,将一些常用但生命周期不稳定的对象提前创建并存储起来,当需要时直接从池中取出,不再使用的对象则放回池中,而不是直接销毁。这样可以减少对象的创建和销毁...

    C++对象池源码示例

    通过对象池,我们可以将这些对象集中管理,当需要时从池中取出一个已存在的对象,用完后归还给池,而不是直接销毁。这样,避免了反复的内存分配和回收,提高了程序运行效率。 实现C++对象池的一般步骤如下: 1. **...

    Apache common pool2 对象池

    Apache Commons Pool2 是一个强大的对象池库,广泛用于Java应用程序中,以提高性能和资源管理。对象池允许程序创建一组预先配置的对象,而不是每次需要时都创建新的对象,从而节省了初始化新对象的时间和系统资源。...

    Unity中对象池插件

    2. **对象复用**:当需要创建新对象时,对象池会从池中获取一个非活动对象,而不是创建新的实例,从而避免了频繁的内存分配和垃圾回收。 3. **对象回收**:当对象不再需要时,而不是立即销毁,它会被返回到对象池中...

Global site tag (gtag.js) - Google Analytics