google-app-engine memory-leaks task-queue permgen

google app engine - Quedando sin espacio PermGen al usar DeferredTasks en GAE 1.7.3



google-app-engine memory-leaks (1)

Cambié a Google App Engine Java SDK 1.7.3 recientemente. Desde entonces, me estoy quedando sin espacio PermGen cada vez que envío Tareas DeferredTasks en la cola de tareas.

  • Esto no sucede cuando la aplicación se implementa en App Engine. Sólo sucede a nivel local. Pero está bloqueando mis pruebas locales y fallando las pruebas de integración.
  • Está sucediendo en MacOSX 10.7.5 con 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)

  • Y esto es parte del stacktrace que estoy viendo cuando ocurre el problema.

    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

Vea a continuación el código que desencadena el problema. DeferredTask tiene una referencia de memcache para obtener datos de memcache y posiblemente eliminarlos. La tarea se está ejecutando con un retraso de 10 segundos.

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"); } } } }

¿Alguien más puede reproducir esto? ¡Gracias!

Actualización: creé el problema 8377 para esto en la página de Google Code de GAE.


Este problema se resolvió el 12 de agosto de 2014 en la versión 1.9.6 AppEngine SDK. MaxPermSize solo se puede configurar en el servidor de desarrollo local.