Срок действия синглетонов в Google App Engine может истечь, или же срок действия любой статической переменной может истечь? (Джава) - PullRequest
1 голос
/ 22 июля 2010

Я читал, что в Google App Engine есть шанс, что одноэлементный класс может умереть, если приложение слишком долго простаивает (или создается новый экземпляр приложения), и я сам испытал это.

Но означает ли это, что любая статическая переменная в любом классе может устареть в приложении? или как GAE может определить, что этот класс является синглтоном?

Ответы [ 3 ]

5 голосов
/ 22 июля 2010

App Engine может и будет выгружать приложения, которые простаивают в течение долго неопределенного периода времени. Другими словами, ваше приложение по существу будет закрыто.

Кроме того, GAE может запускать ваше приложение во многих процессах на многих серверах, если ваш трафик достаточно высок.

Таким образом, полагаться на статические члены или даже Singletons, вероятно, является плохой идеей в такой среде - с GAE вы не контролируете, когда ваше приложение запускается / останавливается / загружается на другие машины.

Эти два вопроса в часто задаваемых вопросах по GAE Java частично касаются этого:

edit: Я должен сказать, что "длительный период времени" на самом деле не определен, и я не думаю, что Google публикует его. Было бы правильнее сказать, что App Engine будет выгружать приложения, которые простаивают в течение некоторого неопределенного периода времени.

3 голосов
/ 22 июля 2010

Кто-то поправит меня, если я ошибаюсь в этом, но я думаю, что у вас вообще не может быть синглетонов, поскольку ваше приложение может работать в n процессах.

2 голосов
/ 22 июля 2010

Предполагая, что синглтон реализован как статические методы в классе или как статическая ссылка (есть ли другие способы?), Синглтон можно собрать, выгрузив загрузчик классов, который загрузил класс синглтона, предполагая, что ссылок нетиз классов в других загрузчиках классов (например, общая проблема - экземпляры ThreadLocal, висящие на ссылках.)

Я не использовал GAE, но я предполагаю, что это то, что происходит - загрузчик классов выгружается.GAE не знает, что это синглтон - он просто освобождает ссылку на загрузчик классов.Для приложений в контейнере, это в идеале единственная ссылка, хранящая приложение в памяти (если вам повезет!).Когда это недоступно, все приложение становится недоступным и собирается сборщиком мусора.Конечно, любые запущенные потоки могут иметь ссылки на экземпляры приложения, и поэтому это будет мешать этому, но я предполагаю, что контейнер контролирует потоки приложений и освобождает загрузчик классов, только когда нет запросов (т. Е. Потоков), выполняющих приложение.код.

...