在我公司工作了一段时间,我们使用了一个自行开发的ObjectPool<T>实现,它提供对其内容的阻止访问.它非常简单:a Queue<T>,a ,object锁定,以及在AutoResetEvent添加项目时向"借用"线程发出信号.
该类的肉真的是这两种方法:
public T Borrow() {
lock (_queueLock) {
if (_queue.Count > 0)
return _queue.Dequeue();
}
_objectAvailableEvent.WaitOne();
return Borrow();
}
public void Return(T obj) {
lock (_queueLock) {
_queue.Enqueue(obj);
}
_objectAvailableEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)
我们一直在使用这个和其他一些集合类而不是那些System.Collections.Concurrent因为我们使用的是.NET 3.5而不是4.0.但最近我们发现,由于我们使用无扩展,我们实际上做有Concurrent提供给我们的命名空间(在System.Threading.dll).
当然,我认为既然BlockingCollection<T>是Concurrent命名空间中的核心类之一,它可能会提供比我或我的队友写的更好的性能.
所以我尝试编写一个非常简单的新实现:
public T Borrow() {
return _blockingCollection.Take();
}
public void Return(T obj) {
_blockingCollection.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,根据一些简单的测试(从多个线程借用/返回池几千次),我们的原始实现在性能方面显着优势BlockingCollection<T>.他们似乎都工作正常 ; 只是我们原来的实现似乎要快得多.
我的问题: …
据我所知,对象池是一个创造性的模式,而flyweight是一种结构模式,但实际上我看不出两者之间有很大差异.有人可以向我解释一下这些差异,以及每种方法在实施中有用吗?
如何优化具有大量(数百万)长寿命对象的应用程序的堆大小使用?(大缓存,从数据库加载大量记录)
我正在寻找通用编程或Java特定的答案.没有时髦的编译器开关.
编辑:
优化POJO的内存表示,它可以在堆中出现数百万次.
用例
简历回复:
我们的应用程序在运行时会创建大量小对象.它主要归结为Autoreleased NSString和NSNumber对象.由于应用程序被设计为在后台堆运行"24/7",因此碎片化成为一个大问题.
如果没有完整的程序重组,有哪些技术可以避免这种情况.
我在想: - 在最终版本发布后将对象返回池的对象池,但是objets需要是可变的.(NSMuttableString会导致堆碎片吗?)
其他人如何处理这个问题?
编辑:这就是我对内存碎片的怀疑.看看rpages和[vm-pageshortage]
eIncident Identifier: 81E87769-8E16-4439-AFFA-6D077E01E5ED
CrashReporter Key: 96235931c31c6b92a16f5c1b1e4cb363a3d18a67
Hardware Model: iPhone4,1
OS Version: iPhone OS 7.0.4 (11B554a)
Kernel Version: Darwin Kernel Version 14.0.0: Fri Sep 27 23:00:48 PDT 2013; root:xnu-2423.3.12~1/RELEASE_ARM_S5L8940X
Date: 2013-12-13 22:43:36 -0800
Time since snapshot: 1582 ms
Free pages: 1105
Active pages: 3668
Inactive pages: 2035
Speculative pages: 46
Throttled pages: 100120
Purgeable pages: 0
Wired pages: 22159
File-backed pages: 5400
Anonymous pages: 349
Compressions: 0
Decompressions: 0
Compressor Size: 0
Uncompressed …Run Code Online (Sandbox Code Playgroud) scala管理对象池的首选方法是什么?
我需要创建和删除单线程的大规模对象(不需要同步).在c ++中,我使用了静态对象数组.
什么是在scala中应对它的惯用和有效方法?
最近我一直在寻找一个池/分配器机制.Boost Pool似乎提供了解决方案,但仍有一些东西,它无法从文档中推断出来.
object_pool似乎提供了分配需求的好方法1)但是它想为分配器设置一个固定的大小来使用.默认情况下它会抓住内存.如果可能的话,我想给它一个可以在其中播放的地址空间.
char * mem_for_class[1024*1024];
boost::object_pool<my_class,mem_for_class> q;
Run Code Online (Sandbox Code Playgroud)
要么:
const int max_no_objs=1024;
boost::object_pool<my_class,max_no_objs> q;
Run Code Online (Sandbox Code Playgroud)
虽然UserAllocator在Boost :: Pool中可用; 它似乎打败了这一点.我担心所需的控制会使它效率太低......而且从头开始会更好.
问题有点类似于第一个问题.在将boost :: pool_allocator提供给std-type-class(例如map)时,boost pool是否提供了限制分配内存的位置的方法
嵌入式linux编程.系统必须继续运行.所以我们不能冒任何内存分段的风险.目前我主要是静态分配(堆栈),还有一些原始的"新".我想要一个分配方案,确保每次程序循环时我使用相同的内存区域.速度/空间很重要,但安全仍然是首要任务.
我希望StackOverflow是值得一提的地方.我试图联系Boost :: Pool"Stephen"的作者,但没有运气.我还没有找到任何特定于Boost的论坛.
他们存在吗?
*添加澄清:
是否有任何可用的库实现无锁(这是线程安全的,可能是实现自旋锁或其他轻量级同步)ObjectPool(http://en.wikipedia.org/wiki/Object_pool_pattern)使用模板用C++语言编写?
当使用apache common pool时,它可以为我提供Java对象池的良好实现。然而,它们的KeyedPoolableObjectFactory接口不是类型安全的。Java中有没有对象池库可以提供泛型接口供我们创建类型安全的对象池?
我的印象是,a object pool是一种设计模式,用于管理客户端可以请求的一组预分配对象,并返回其中一个对象.然而,似乎boost.pool的object_pool类更多的是用较低级存储器管理不是目标管理.他们为什么选择这个名字,而不是像memory_pool?我是否认为boost的对象池实际上是一个内存池方案?或者它们基本上是一回事?另外,为什么还没有更高级别的对象池模式的标准实现?
我想在我的C#应用程序中使用一个对象池,我知道C#中没有任何引用计数.如果同一个对象可以传递给多个线程,我怎么知道什么时候没有更多对该对象的引用,以便我可以将它返回到对象池?
我想在dispose方法中做到这一点,但是为时已晚,并且由于它被丢弃,所以它无法返回到池中.
假设您正在使用一个简单的类,并且对象创建并不重:
class Simple {
public final int data1;
public final float data2;
...
}
Run Code Online (Sandbox Code Playgroud)
您必须不断将简单对象放入队列:
queue.add(new Simple(123,123f,...));
Run Code Online (Sandbox Code Playgroud)
使用Object-Pool并更改Simple-Class可修改类更快吗?我希望不是.
objectpool ×11
c++ ×3
java ×3
memory ×2
.net ×1
allocation ×1
blocking ×1
boost ×1
boost-pool ×1
c# ×1
caching ×1
collections ×1
heap ×1
ios ×1
lock-free ×1
objective-c ×1
scala ×1
templates ×1