美文网首页
11、关于对象池的思考

11、关于对象池的思考

作者: 技术灭霸 | 来源:发表于2020-08-12 09:07 被阅读0次

对象池作为全局资源,高并发环境中多个线程可能同时需要获取对象池的对象,因此多个线程在争抢对象时因为锁竞争而阻塞,因此使用对象池有线程同步的开销,而不使用对象池则有创建和销毁对象的开销。对于对象池本身的设计来说,需要尽量做到无锁化,比如Jetty就使用了ConcurrentLinkedDeque。如果你的内存足够大,可以考虑线程本地对象池,这样每个线程都有自己的对象池,线程之间互不干扰。

为了防止对象池的无限膨胀,必须要对池的大小做限制。对象池太小发挥不了作用,对象池太大的话可能有空闲对象,这些空闲对象会一直占用内存,造成内存浪费。这里你需要根据实际情况做一个平衡,因此对象池本身除了应该有自动扩容的功能,还需要考虑自动缩容。

所有的池化技术,包括缓存,都会面临内存泄露的问题,原因是对象池或者缓存的本质是一个Java集合类,比如List和Stack,这个集合类持有缓存对象的引用,只要集合类不被GC,缓存对象也不会被GC。维持大量的对象也比较占用内存空间,所以必要时我们需要主动清理这些对象。以Java的线程ThreadPoolExecutor
为例,它提供了allowCoreThreadTimeOut和setKeepAliveTime两种方法,可以在超时后销毁线程,我们在实际项目中也可以参考这个策略。

另外在使用对象池时,我这里还有一些小贴士供你参考:

  • 对象在用完后,需要调用对象池的方法将对象归还给对象池。
  • 对象池中的对象在再次使用时需要重置,否则会产生脏对象,脏对象可能持有上次使用的引用,导致内存泄漏等问题,并且如果脏对象下一次使用时没有被清理,程序在运行过程中会发生意想不到的问题。
  • 对象一旦归还给对象池,使用者就不能对它做任何操作了。
  • 向对象池请求对象时有可能出现的阻塞、异常或者返回null值,这些都需要我们做一些额外的处理,来确保程序的正常运行。

相关文章

  • 11、关于对象池的思考

    对象池作为全局资源,高并发环境中多个线程可能同时需要获取对象池的对象,因此多个线程在争抢对象时因为锁竞争而阻塞,因...

  • unity——关于对象池

    关于对象池,其实是为了避免重复的对场景中的某个需要大量存在的物体进行销毁,创建这样反复的过程。当然反复的进行销毁与...

  • 关于线程池的思考

    如果频繁使用线程的情况下,每次都使用New thread,有以下几点不好的地方。 性能低下。每次都需要新建线程,浪...

  • 08--内存管理--大话自动释放池

    思考:一个对象什么时候加入自动释放池? How AutoreleasePool 自动释放池是一个抽象的概念 自动释...

  • 关于找对象的思考

    结婚的恰当理由:我走在成长为一个完整的人的道路上,在未来的某个时间,我感到自己杯子里的东西是如此丰富,需要找一个人...

  • Unity--简单的对象池

    简单的对象池分三步走: 建立对象池 拿到对象 回收对象 Test为对象池,Obj为自动回收的物体 Test.cs ...

  • Laya_2D示例项目使用对象池预制体的创建、位置设置和添加到父

    //使用对象池创建盒子 1.对象池的使用 对象池创建箱子 let box = Laya.Pool.getI...

  • 关于标地池的思考

    一、原则: 以指数基金为主,部分专业性较强指数无较好成分股时,可选主动基金 二、诉求 长期收益15%+ 适合每月结...

  • 关于common pool 对象池的使用

    1 继承工厂类 BasePooledObjectFactory 2 生成GenericObjectPoolCon...

  • Unity 类对象池资源池对象池

    类对象池 包含创建对象池,取对象池中的内容,回收。 对象管理类 因为使用加载AB包的时候可能会频繁创建类,但是ne...

网友评论

      本文标题:11、关于对象池的思考

      本文链接:https://www.haomeiwen.com/subject/ghgldktx.html