代码之家  ›  专栏  ›  技术社区  ›  corgrath

谷歌应用引擎中的单件可以过期,或者任何静态变量都可以过期吗?(爪哇)

  •  1
  • corgrath  · 技术社区  · 16 年前

    我读到,在谷歌应用引擎中,如果应用程序闲置太久(或者创建了一个新的应用程序实例),可能会有一个单例类死亡,我自己也经历过这种情况。

    但这真的意味着任何类中的任何静态变量都可能在应用程序中过期吗?或者GAE如何识别这个类是单例的?

    3 回复  |  直到 16 年前
        1
  •  5
  •   matt b    16 年前

    应用引擎可以并将卸载空闲的应用程序 长的 未定义的时间段。换句话说,应用程序将基本上关闭。

    此外,如果您的流量足够大,GAE可以跨多个服务器在多个进程中运行您的应用程序。

    因此,在这样的环境中,依赖静态成员甚至是单例成员可能是一个坏主意——使用GAE,您无法控制应用程序在其他计算机上的启动/停止/加载时间。

    GAE Java FAQ中的这两个问题部分地解决了这个问题:

    编辑: 我应该说,“长时间”实际上是未定义的,我认为谷歌不会发布它。更正确的说法是,应用程序引擎将卸载闲置一段时间的应用程序。

        2
  •  3
  •   Carl Düvel    16 年前

    如果我错了,有人会纠正我,但我认为你根本就不能有单件,因为你的应用程序可以在n个进程中运行。

        3
  •  2
  •   mdma    16 年前

    假设singleton是作为类中的静态方法实现的,或者作为静态引用实现的(还有其他方法吗?),可以通过卸载加载了singleton类的类加载器来垃圾收集singleton,前提是在其他类加载器中没有来自类的引用(例如,常见的问题是挂起引用的线程本地实例)。

    我还没有使用GAE,但我想这就是发生的事情——类加载器正在被卸载。GAE不知道这是一个单实例——它只是释放对类加载器的引用。对于容器中的应用程序,理想情况下,这是将应用程序保存在内存中的唯一参考(如果幸运的话!)。一旦无法访问,整个应用程序将变为不可访问,并由垃圾收集器收集。当然,任何运行的线程都可能引用应用程序实例,因此会对此产生干扰,但我假设容器控制应用程序线程,并且仅在没有运行应用程序代码的请求(即线程)时释放类加载器。