Нехватка места PermGen при использовании DeferredTasks в GAE 1.7.3

Недавно я перешел на Google App Engine Java SDK 1.7.3. С тех пор мне не хватает пространства PermGen каждый раз, когда я отправляю DeferredTasks в очередь задач.

  • Этого не происходит, когда приложение развернуто в App Engine. Это происходит только локально. Но это блокирует мое локальное тестирование и проваливает интеграционные тесты.
  • Это происходит на MacOSX 10.7.5 с Java 6.

    $ java -version 
    java version "1.6.0_37"
    Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
    Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
    
  • И это часть трассировки стека, которую я вижу, когда возникает проблема.

    INFO: Successfully processed ../target/projectName/WEB-INF/queue.xml
    Nov 1, 2012 3:04:00 PM com.google.appengine.api.taskqueue.dev.LocalTaskQueue init
    INFO: LocalTaskQueue is initialized
    Nov 1, 2012 3:04:01 PM org.quartz.simpl.SimpleThreadPool initialize
    INFO: Job execution threads will use class loader of thread: 1255545583@qtp-1458850232-0
    Nov 1, 2012 3:04:02 PM org.quartz.core.QuartzScheduler <init>
    INFO: Quartz Scheduler v.UNKNOWN.UNKNOWN.UNKNOWN created.
    Nov 1, 2012 3:04:02 PM org.quartz.simpl.RAMJobStore initialize
    INFO: RAMJobStore initialized.
    Nov 1, 2012 3:04:02 PM org.quartz.impl.StdSchedulerFactory instantiate
    INFO: Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
    Nov 1, 2012 3:04:02 PM org.quartz.impl.StdSchedulerFactory instantiate
    INFO: Quartz scheduler version: UNKNOWN.UNKNOWN.UNKNOWN
    Nov 1, 2012 3:04:02 PM org.quartz.core.QuartzScheduler start
    INFO: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    Nov 1, 2012 3:04:02 PM com.google.appengine.api.taskqueue.dev.LocalTaskQueue start_
    INFO: Local task queue initialized with base url http://localhost:8083
    Exception in thread "DefaultQuartzScheduler_Worker-9" java.lang.OutOfMemoryError: PermGen space
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
            at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
            at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at com.google.appengine.tools.development.DevAppServerClassLoader.loadClass(DevAppServerClassLoader.java:92)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            at com.google.appengine.api.urlfetch.URLFetchServicePb$URLFetchRequest.newBuilder(URLFetchServicePb.java:1902)
            at com.google.appengine.api.taskqueue.dev.UrlFetchJob.newFetchRequest(UrlFetchJob.java:152)
            at com.google.appengine.api.taskqueue.dev.UrlFetchJob.execute(UrlFetchJob.java:83)
            at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
            at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    Exception in thread "1255545583@qtp-1458850232-0" java.lang.OutOfMemoryError: PermGen space
    Exception in thread "Timer-6" java.lang.OutOfMemoryError: PermGen space
    Exception in thread "Timer-4" java.lang.OutOfMemoryError: PermGen space
    Exception in thread "Timer-2" java.lang.OutOfMemoryError: PermGen space
    Exception in thread "Timer-8" java.lang.OutOfMemoryError: PermGen space
    

Ниже приведен код, вызывающий проблему. DeferredTask имеет ссылку на memcache для получения данных из memcache и, возможно, его удаления. Задача выполняется с задержкой в ​​10 секунд.

class Foo {
    private void enqueueTask() {
        queue.add(TaskOptions.Builder.withPayload(new Task()).countdownMillis(10 * 1000));
    }

    private static class Task implements DeferredTask {
        private static final MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
        private static final Logger log = Logger.getLogger(Task.class.getName());

        @Override
        public void run() {
            final String key = ...;

            if (memcache.contains(key)) {
                final Object value = memcache.get(key);

                if (some condition depending on value) {
                    memcache.delete(key);
                    memcache.increment(some other field, -1l);
                }
            } else {
                log.warning("error message");
            }
        }
    }
}

Может ли кто-нибудь еще воспроизвести это? Спасибо!

Обновление: я создал проблему 8377. для этого на странице кода Google GAE.


person Ingo    schedule 01.11.2012    source источник
comment
Почему бы вам просто не увеличить объем памяти, используя аргумент XXMaxPermSize JVM?   -  person Kirill Lebedev    schedule 02.11.2012
comment
Прежде всего, я думаю, что что-то не так в моем приложении/самом GAE. Я не делаю ничего особенного и хотел бы понять, почему мне не хватает места в PermGen. Я буквально запускаю GAE и вызываю один URL, который добавляет DeferredTask. Во-вторых, я использую maven-gae-plugin. И оба (1) добавление XXMaxPermSize в MAVEN_OPTS и (2) добавление его в ‹configuration›‹argLine›..‹/argLine›‹/configuration› maven-gae-plugin не меняет размер пространства PermGen. Это не воспринимается JVM, запущенной Maven для запуска GAE.   -  person Ingo    schedule 02.11.2012
comment
Как бы мы увеличили пространство PermGen при работе в GAE? Это вообще возможно?   -  person Ingo    schedule 10.01.2013
comment
Вы не можете изменить конфигурацию экземпляра на сервере. Вы можете сделать это только для локальной среды разработки.   -  person Kirill Lebedev    schedule 10.01.2013
comment
просто полезный указатель   -  person Siva Tumma    schedule 18.01.2014
comment
Не могли бы вы сообщить свой текущий предел MaxPermSize?   -  person zeppaman    schedule 29.04.2014
comment
Возможное исправление в процессе   -  person indivisible    schedule 29.04.2014


Ответы (1)


Эта проблема была решена 12 августа 2014 г. в выпуске 1.9.6 AppEngine SDK. MaxPermSize можно установить только на локальном сервере разработки.

person Bogdan.Nourescu    schedule 25.05.2015
comment
MaxPermSize можно установить только на локальном сервере разработки. , как? - person Jeryl Cook; 29.07.2016