2012-11-01 9 views
17

Sono passato a SDK Java di Google App Engine 1.7.3 di recente. Da allora, sono a corto di Spazio permGen ogni volta che invio DeferredTasks nella coda delle attività.Esaurimento dello spazio PermGen quando si utilizza DeferredTasks in GAE 1.7.3

  • Ciò non accade quando l'app viene distribuita a App Engine. Succede solo localmente. Ma sta bloccando i miei test di integrazione e test di integrazione locali.
  • Sta accadendo su 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) 
    
  • E questo fa parte del stacktrace sto vedendo quando si verifica il 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: [email protected] 
    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 "[email protected]" 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 
    

Vedere sotto per il codice che attiva il problema. Il DeferredTask ha un riferimento a memcache per ottenere dati da memcache e potenzialmente rimuoverlo. L'attività è in esecuzione con un ritardo di 10 secondi.

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

Qualcuno può riprodurlo? Grazie!

Aggiornamento: Ho creato issue 8377 per questo nella pagina Codice Google di GAE.

+4

Perché non aumentare solo una quantità di memoria utilizzando XXMaxPermSize JVM arg? –

+2

Prima di tutto, penso che qualcosa non funzioni nella mia app/GAE. ** Non sto facendo nulla di speciale e vorrei capire perché sono a corto di spazio PermGen. Sto letteralmente avviando GAE e invoco un URL che aggiunge un DeferredTask. ** In secondo luogo, sto usando il plugin maven-gae. Ed entrambi (1) aggiungendo XXMaxPermSize al ** MAVEN_OPTS ** e (2) aggiungendolo a .. di maven-gae-plugin non modifica la dimensione dello spazio PermGen. Questo non viene rilevato dalla JVM avviata da Maven per eseguire GAE. – Ingo

+1

Come potremmo aumentare lo spazio PermGen durante l'esecuzione all'interno di GAE? È possibile? – Ingo

risposta

2

Questo problema è stato risolto il 12 agosto 2014 nella versione 1.9.6 di SDK AppEngine. MaxPermSize può essere impostato solo sul server dev locale.

+0

MaxPermSize può essere impostato solo sul server dev locale. , Come? –

Problemi correlati