2011-04-01 72 views
3

我有一个Java应用程序,它使用spymemcached库(http://code.google.com/p/spymemcached)来读写对象到memcached。估算memcached内Java对象的大小

应用程序总是将相同类型的对象缓存到memcached。缓存的对象始终是5或6个java.util.Strings的ArrayList。使用SizeOf库(http://www.codeinstructions.com/2008/12/sizeof-for-java.html),我确定ArrayList的平均深度大小约为800字节。

总体而言,我已将12 GB的RAM分配给memcached。我的问题是:有多少这些对象可以memcached持有?

我不清楚如果使用SizeOf中的“800字节”度量标准是正确的,或者这是误导性的。例如,SizeOf计数每个字符为2个字节。我知道我的字符串中的每个字符都是常规的ASCII字符。我相信spymemcached使用Java序列化,并且我不确定是否会导致每个char占用1个字节或2个字节。

此外,我不知道每个对象开销memcached使用多少。所以计算应考虑memcached用于其内部数据结构的RAM。

我不需要一个完全100%的数字。一个粗糙的信封计算会很好。

+0

您是否将Java对象序列化为memcached? – 2011-04-01 18:37:44

+0

是的,似乎spymemcached正在使用Java序列化。 – 2011-04-01 19:32:25

回答

3

简单的办法是实验:

  1. 重启的memcache
  2. 校验字节分配:echo "stats" | nc localhost 11211 | fgrep "bytes "
  3. 插入1个对象,校验字节分配
  4. 插入10个对象,检查分配
  5. 字节等等

这应该给你一个每字节字节的好主意。

但是,即使你找出你的系列化规模,单独大概不会告诉你,大小内存缓存多少对象将举行。 Memcache的slab系统和LRU实现使得对这种性质的任何估计都很困难。

内存缓存并没有真正似乎是围绕保证数据的可用性而设计的 - 当你得到一个关键,它可能有,也可能没有:也许是过早地清除;也许池中的一台或两台服务器出现故障。

+0

这无疑解决了各地反序列化后会被发送过线的字节数的不确定性。我不需要保证memcached中有任何特定的对象。我只需要估算memcached在满载时会有多少个对象。仍然缺少的主要信息是每个对象有多少内存memcached使用的开销。 – 2011-04-01 20:50:56