【发布时间】:2011-03-14 18:23:32
【问题描述】:
作为内存分析的一部分,我们发现了以下内容:
实时分配的堆栈类百分比 rank self accum bytes objs bytes objs 跟踪名称 3 3.98% 19.85% 24259392 808 3849949016 1129587 359697 字节[] 4 3.98% 23.83% 24259392 808 3849949016 1129587 359698 字节[]您会注意到分配了许多对象,但很少有对象仍然存在。这是出于一个简单的原因 - 为生成的“客户端”的每个实例分配两个字节数组。客户端不可重用——每个客户端只能处理一个请求,然后被丢弃。字节数组始终具有相同的大小 (30000)。
我们正在考虑迁移到字节数组池(apache 的 GenericObjectPool),因为通常在任何给定时刻都有已知数量的活动客户端(因此池大小不应波动太大)。这样,我们可以节省内存分配和垃圾收集。问题是,池会导致严重的 CPU 命中吗?这个主意是个好主意吗?
感谢您的帮助!
【问题讨论】:
-
您不能使用合理大小的数组或重用部分客户端工作人员吗?
-
是什么阻止您在完成“客户端”并重新使用它们(在池中)?
-
客户端对象有许多不同的状态变量,这些变量在其生命周期中会发生变化。我们可以简单地重新初始化客户端并根据需要再次使用它,但鉴于客户端 90% 的内存使用是这两个字节数组,因此只关注它们并通过彻底改变客户端的行为来减少我们可能造成的混乱是有意义的.数组的大小是这样的,因为它们是用于高速网络连接的缓冲区。
标签: java bytearray memory-management