1

我一直在玩缓存对象(首先创建我自己的缓存,结果是一个稳定的实现但效率很低),然后尝试使用 Memcached。

尽管 memcached 工作得很好,但我遇到了一个问题。

我如何使用我的对象如下:

  • 我将数据库中的数据读入一个对象,然后将该对象存储在 memcached 中。
  • 每隔几分钟,我会从 memcached 中检索对象,从数据库或 memcached 中的其他对象中检索任何其他数据,使用任何新的/相关数据更新对象,然后将对象存储回 memcached。
  • 需要查看的对象从 memcached 中提取、打包并发送到客户端应用程序以进行显示。

这非常有效,除非我在 memcached 中创建-存储-更新-查看的对象数量变高。Java/Tomcat-jvm 似乎没有对我从 memcached 中提取的对象进行“足够快”的垃圾收集,并且 vm 内存不足。

我的内存限制为 8GB(如果可以的话,最好将其降低到 4 - 使用 memcached),所以我的问题是,是否有解决方案可以防止 JVM 内存使用量扩展得如此之快(或调整垃圾收集器)?

(PS 我考虑过使用 Google 的 Guava 缓存,但这限制了我的并发选项,例如,如果我必须重新启动 tomcat,并且同时使用 Guava 和 memcached 似乎是我希望避免的各种重复)

——海因。

4

1 回答 1

0

垃圾收集器不能“太慢”而耗尽内存。在抛出 OutOfMemoryError 之前,保证垃圾收集器运行。只有当它不能释放足够的内存时才会抛出错误。

您应该使用分析器来查看您是否有内存泄漏,或者您是否只是挂在太多对象上。

之后您可能想要调整 GC 以提高性能,请参见此处的示例:GC 调整

于 2013-07-31T08:53:22.680 回答