【问题标题】:Deallocation for static class instance variable静态类实例变量的释放
【发布时间】:2012-04-24 18:10:24
【问题描述】:

这是我的第一个问题,所以如果我没有完成问题或遗漏了什么,请告诉我。

背景: 好吧,我有一个基于 Java 的 Web 服务,它正在为 iPhone 应用程序提供服务。它与数据库有连接,为了提高性能,我使用 Memcached 实现了缓存。我使用的连接器是 spymemcached。

我的问题: 我有一个与 memcached 服务器同步连接的静态类。 我的参考是:http://sacharya.com/using-memcached-with-java/

但是当我重新启动 memcached 服务器或在 tomcat 上部署另一个 jar 时,我收到此错误: Web 应用程序似乎启动了一个线程名称 [某个名称],但未能停止它。这很可能会造成内存泄漏。

那么,如何在我可以在 tomcat 上重新启动或重新部署我的应用程序之前解除分配静态类?

-- 谢谢。

【问题讨论】:

  • 我很确定最好的答案是不要将同步连接存储在静态变量或类中。

标签: java tomcat web-applications memcached spymemcached


【解决方案1】:

静态类不是问题。假设它位于 WEB-INF/lib 的 JAR 中,它将被卸载。问题是线程。无论启动该线程需要停止它。有关 Tomcat 的内存泄漏预防和检测的更多详细信息,请参阅此演示文稿: http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

【讨论】:

  • 谢谢马克。我正在调查。
【解决方案2】:

该页面为 MyCache 类实现了单例模式。 单例不能被销毁。

也许您可以定义一个 ServletContextListener(或应用服务器中的类似侦听器)来手动停止线程。

【讨论】:

  • 错了。如果单例由 Web 应用程序的类加载器加载,则可以将其销毁。当 Web 应用程序类加载器停止并且本身符合 GC 条件时,GC 足够聪明地处理这种特殊情况。
  • 我确信 JVM 可以摧毁它。我的回答与“那么,如何在我可以在 tomcat 上重新启动或重新部署我的应用程序之前释放静态类?”的问题有关。不能在编程层销毁,这是Singleton实现的主要问题。
  • 如果我想用代码来做呢?我怎么做?我知道这是一个愚蠢的问题。只是好奇。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2011-11-11
  • 2011-12-18
  • 2013-02-09
相关资源
最近更新 更多