关于ObjectPooling的问题

时间:2019-03-27 13:03:22

标签: java server pool object-pooling

我目前正在为游戏使用简单的UDP服务器。我已经借助ThreadPoolExecutor实现了多线程。在阅读有关如何最大化性能的信息时,我偶然发现了ObjectPooling。经过一番阅读后,我剩下三个问题:

1)服务器程序是否可以利用ObjectPool?

2)哪些“对象”应该合并,哪些不应该?

3)如何创建一个简单的ObjectPool?

3 个答案:

答案 0 :(得分:2)

  

服务器程序将能够利用ObjectPool吗?

这不取决于应用程序的类型。对象池的有用性取决于用例。

  

应该合并哪个“对象”,哪些不应该?

通常,应将创建成本很高(在内存或CPU方面)的对象池化(仍然可以选择)。 避免合并任何其他类型,因为合并本身可能会变得非常昂贵。

  

如何创建一个简单的ObjectPool?

不要。这是一个复杂的主题。
而是使用Apache Commons Pool之类的东西。


然后我将添加自己的

  

我应该关心对象池吗?

直到您对性能进行基准测试而不使用它。
池化是一种冒险的模式,尤其是在多线程环境中。 池实现应该提供所需的同步,但是,如果该对象保持状态,则添加自己的对象也不错。

答案 1 :(得分:2)

这是您问题的答案,

  

1)服务器程序是否可以利用ObjectPool?

是的,可以合并任何对象。如果对象创建需要大量操作,通常会使用对象池。

  

2)哪些“对象”应该合并,哪些不应该?

任何对象都可以合并。

  

3)如何创建一个简单的ObjectPool?

您可以使用apache commons pool实现简单的pool。有关更多信息,请参见https://commons.apache.org/proper/commons-pool/examples.html

编辑:仅供参考,我们使用apache commons池实现了对象池,用于连接到CORBA客户端。连接到CORBA和创建对象需要花费更多时间,因此我们实现了CORBA客户端池。

答案 2 :(得分:1)

  

1)服务器程序是否可以利用ObjectPool?

与应用程序类型无关,这取决于用例,尤其是当程序的性能对内存和CPU敏感时。

  

2)哪些“对象”应该合并,哪些不应该?

IMO,什么情况使某些类对象的池有用:

  • 当系统一次仅需要固定或有限类型(状态)的对象时
  • 当您需要对特定类别的最大对象施加上限
  • 当对象创建需要占用大量内存和/或cpu且对象可以按原样重复使用或执行最少操作时
  • 当对象本身占用大量内存和/或频繁使用时

除上述条件外,不得缓存对象或必须是不可变的

  

3)如何创建一个简单的ObjectPool?

这完全是一个复杂的话题,但是从本质上讲,您需要构建一个对象创建者(某种工厂),该对象创建者应决定是创建新对象还是返回状态已存在的所需更改。