对象池

一种对象池实现方案

狂风中的少年 提交于 2020-01-11 02:40:09
对象池能让创建对象的cpu开销减少,也可以让内存控制再一定的数量上,是大量角色或物体创建移除的比较合适的解决方案。但很多用的是针对指定类型或场景下使用的对象池,很难做到通用。最近研究到,有这样一套对象池的解决方案。 这套解决方案同样会分为获取Get,移除Release后回收。只是可以自定义我们需要获得的对象类型。 代码如下: //Game 中对象池ObjectPool //需要自定义TypeOp.ObjCreator来创建对象 //需要自定义TypeOp.ObjClear来清理对象 //#define OBJECT_POOL_DEBUG using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace QMGame { public static class ObjectPool { private static Dictionary<Type, object> poolDictionary = new Dictionary<Type, object>(); const int TotalNum = 30; public static void Clear() { poolDictionary.Clear(); } /// <summary>

Java性能小技巧

僤鯓⒐⒋嵵緔 提交于 2020-01-04 03:42:53
局部决定整体。一个应用的整体性能取决于每个组件的性能。下面是一些帮助你提高应用性能的Java编程技巧: 编程技巧 原因及策略 避免重复创建对象 为什么: 更少的对象会需要更少的垃圾回收 使用的空间越少,应用的性能越好 怎么做: 重复利用一个对象,而不是在每次需要的时候都去创建一个功能一样的对象 (这样做) String s = “No longer silly”; (不要这样) String s = new String(“silly”); 不可变类中既提供构造函数,又提供了静态工厂方法的,优先考虑使用静态工厂方法。 复用那些一旦初始化(使用静态初始化)就不会改变的对象 避免循环引用 为什么: 一组相互引用的对象,如果他们没有被其他对象直接引用的话,它们会变得不可达,这样会导致它们一直都保留在内存里。 怎么做: 你可以使用强引用来表示“父到子“的引用关系,使用弱引用来表示“子到父”的引用关系。 使用==操作符来替代equals(Object)方法 为什么: ==操作符的性能更好 例如,对于字符串比较,equals()方法会去比较字符串对象里的字符。==操作符会比较两个对象的引用,来比较它们是否指向同一个实例。 怎么做: 当且仅当a == b 的时候才会有a.equals(b) 例如,对于重复调用的地方,使用静态工厂方法来返回相同的对象。 清除无用的对象的引用 为什么:

对象池

别说谁变了你拦得住时间么 提交于 2019-12-23 21:52:43
最近在写游戏的时候用到了对象池。 对象池,算是设计模式吧。 对象池中包含若干提前准备好的若干实例,当需要时从对象池中提取,当不需要时,则重新放入对象池。 一方面,使用对象池不需要频繁的产生和销毁实例对象,另一方面,对象池中的实例如果不够程序调用才会继续产生实例,这大大节省了性能。 比如在这个游戏中用到了很多的平台,用对象池的话就会很明显的优化性能。 代码如下: public class ObjectPool : MonoBehaviour { public static ObjectPool Instance ; private int InitSpawnCount = 5 ; private ManagerVars vars ; private List < GameObject > normalPlantformList = new List < GameObject > ( ) ; private List < GameObject > commonPlantformList = new List < GameObject > ( ) ; private void Awake ( ) { Instance = this ; vars = ManagerVars . GetManagerVars ( ) ; Init ( ) ; } private void Init ( )

Apache Commons Pool2 源码分析 | Apache Commons Pool2 Source Code Analysis

不打扰是莪最后的温柔 提交于 2019-12-21 16:46:17
Apache Commons Pool 实现了 对象池 的功能。定义了对象的生成、销毁、激活、钝化等操作及其状态转换,并提供几个默认的对象池实现。 在讲述其实现原理前,先提一下其中有几个重要的对象: PooledObject(池对象)。 PooledObjectFactory(池对象工厂)。 Object Pool(对象池)。 下面分别详细讲解它们的实现。 PooledObject(池对象) 用于封装对象(如:线程、数据库连接、TCP连接),将其包裹成可被池管理的对象。提供了两个默认的池对象实现: DefaultPoolObject。用于非软引用的普通对象。 PooledSoftReference。用于软引用的对象。 在开发连接池、线程池等组件时,需要根据实际情况重载5个方法:startEvictionTest、endEvictionTest、allocate、deallocate和invalidate,用于在不同的场景下修改被包裹对象的内部状态。 PooledObject有多种 状态 ,在不同的环节或经过处理后状态会发生变化。 状态 描述 IDLE 位于队列中,未使用 ALLOCATED 在使用 EVICTION 位于队列中,当前正在测试,可能会被回收 EVICTION_RETURN_TO_HEAD 不在队列中,当前正在测试,可能会被回收

对象池common-pool2源码分析之对象状态

梦想与她 提交于 2019-12-17 20:42:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对象池common-pool2源码分析 对象池common-pool2策略分析 从前两篇的分析中可以看出对象池中的对象会被激活,钝化,销毁等 ,那么做这些操作的对象需要满足什么条件呢 ,与这些操作之后相对应的对象的状态是什么样的呢? 首先从PooledObjectState开始分析 public enum PooledObjectState { /** * In the queue, not in use. */ IDLE, /** * In use. */ ALLOCATED, /** * In the queue, currently being tested for possible eviction. */ EVICTION, /** * Not in the queue, currently being tested for possible eviction. An * attempt to borrow the object was made while being tested which removed it * from the queue. It should be returned to the head of the queue once * eviction testing

对象池common-pool2策略分析

人走茶凉 提交于 2019-12-17 20:28:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 上一篇: 对象池common-pool2分析 common-pool2策略 上一篇对象池common-pool2分析从三个主要的接口进行分析,这一篇将对源码进行详细的分析,力图找出对象池的管理策略.从之前的分析可以看出ObjectPool定义了对象池需要实现的功能,所以重点分析ObjectPool. GenericObjectPool:一般对象池 Generic KeyedObjectPool:可以根据key分组的对象池 SoftReferenceObjectPool:软引用对象池. GenericObjectPool public GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig config) { super(config, ONAME_BASE, config.getJmxNamePrefix()); if (factory == null) { jmxUnregister(); // tidy up throw new IllegalArgumentException("factory may not be null"); } this.factory = factory; /

对象池common-pool2源码分析

喜夏-厌秋 提交于 2019-12-17 20:21:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Apache common-pool2提供了一个通用的对象池技术的实现。 common-pool2主要围绕三个接口来实现,ObjectPool、PooledObject、PooledObjectFactory。由 PooledObjectFactory创建的对象,经 PooledObject包装后放入 ObjectPool。 1.ObjectPool对象池 ObjectPool:对象池,负责存放管理对象. 官方例子: http://commons.apache.org/proper/commons-pool/examples.html ReaderUtil readerUtil = new ReaderUtil(new GenericObjectPool<StringBuffer>(new StringBufferFactory())); 先从GenericObjectPool开始分析 成员变量: 重要的成员变量为: allObjects和idleObjects. /* * All of the objects currently associated with this pool in any state. It * excludes objects that have been destroyed. The

Apache Common-pool2对象池浅析

人走茶凉 提交于 2019-12-17 19:48:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Apache Common-pool2包提供了一个通用的对象池技术的实现。可以很方便的基于它来实现自己的对象池,比如DBCP和Jedis他们的内部对象池的实现就是依赖于Common-pool2。 对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、数据库连接等对象,因此对象池技术还是有其存在的意义。 1.Apache Common-pool2的实现 common-pool2包括三个包: org.apache.commons.pool2:包含了对象池的接口。 org.apache.commons.pool2.impl:包含了对象池的具体实现。 org.apache.commons.pool2.proxy:包含了对象池的代理。 commons-pool2主要有三大部分构成:ObjectPool,PooledObjectFactory,PooledObject。 ObjectPool:我们直接操作的对象池,主要包括对象的存取和状态的管理,具体对象的创建由PooledObjectFactory来实现。 PooledObjectFactory

java对象池ObjectPool

核能气质少年 提交于 2019-12-07 21:36:33
commons-pool提供了一套很好用的对象池组件。使用也很简单,不过对一些简单的对象使用对象池就没必要了。 ObjectPool定义了一个简单的池化接口,有三个对应实现 GenericObjectPool:实现了可配置的后进先出或先进先出(LIFO/FIFO)行为,默认是作为一个后进先出队列,这意味当对象池中有可用的空闲对象时,borrowObject 将返回最近的对象实例,如果将lifo 属性设置为false,则按FIFO行为返回对象实例。 StackObjectPool :实现了后进先出(LIFO)行为。 SoftReferenceObjectPool: 实现了后进先出(LIFO)行为。另外,对象池还在SoftReference 中保存了每个对象引用,允许垃圾收集器针对内存需要回收对象。 KeyedObjectPool定义了一个以任意的key访问对象的接口(可以池化对种对象),有两种对应实现。 GenericKeyedObjectPool :实现了先进先出(FIFO)行为。 StackKeyedObjectPool : 实现了后进先出(LIFO)行为。 PoolableObjectFactory 定义了池化对象的生命周期方法,我们可以使用它分离被池化的不同对象和管理对象的创建,持久,销毁。

Apache Commons 常用工具包

做~自己de王妃 提交于 2019-12-06 11:03:46
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问 http://jakarta.apache.org/commons/index.html BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder. Collections Commons-Collections 提供一个类包来扩展和增加标准的 Java Collection框架 Configuration Commons-Configuration 工具对各种各式的配置和参照文件提供读取帮助. Daemon 一种 unix-daemon-like java 代码的替代机制 DBCP Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons