2012-11-01 8 views
17

मैंने हाल ही में Google App Engine Java SDK 1.7.3 पर स्विच किया। तब से, जब मैं कार्य कतार में DeferredTasks सबमिट कर रहा हूं, तब से मैं परमगेन स्पेस से बाहर चला रहा हूं।GAE में DeferredTasks का उपयोग करते समय PermGen स्पेस से बाहर निकलना 1.7.3

  • यह तब नहीं होता जब ऐप इंजन पर ऐप को तैनात किया जाता है। यह केवल स्थानीय रूप से होता है। लेकिन यह मेरे स्थानीय परीक्षण को अवरुद्ध कर रहा है और एकीकरण परीक्षण विफल रहा है।
  • यह जावा 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) 
    
  • साथ MacOSX 10.7.5 पर हो रहा है और यह स्टैकट्रेस जब समस्या होती है मैं देख रहा हूँ का हिस्सा है।

    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 
    

कोड कि इस मुद्दे से चलाता है के लिए नीचे देखें। 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"); 
      } 
     } 
    } 
} 

क्या कोई और इसे पुन: पेश कर सकता है? धन्यवाद!

अद्यतन: मैंने GAE के Google Code पृष्ठ पर इसके लिए issue 8377 बनाया।

+4

XXMaxPermSize JVM Arg का उपयोग करके आप स्मृति की मात्रा क्यों नहीं बढ़ाते? –

+2

सबसे पहले, मुझे लगता है कि मेरे ऐप/जीएई में कुछ गलत हो रहा है। ** मैं कुछ खास नहीं कर रहा हूं और समझना चाहता हूं कि मैं पर्मजेन स्पेस से क्यों बाहर निकल रहा हूं। मैं सचमुच जीएई शुरू कर रहा हूं और एक यूआरएल का आह्वान करता हूं जो एक डिफरर्ड टास्क जोड़ता है। ** दूसरा, मैं मेवेन-जीई-प्लगइन का उपयोग कर रहा हूं। और दोनों (1) XXMaxPermSize को ** MAVEN_OPTS ** और (2) में जोड़कर <कॉन्फ़िगरेशन> .. maven-gae-plugin का पर्मगैन स्पेस का आकार नहीं बदलता है। यह जीएई चलाने के लिए मेवेन द्वारा शुरू किए गए जेवीएम द्वारा उठाया नहीं जा रहा है। – Ingo

+1

GAE के भीतर चलते समय हम PermGen स्पेस को कैसे बढ़ाएंगे? क्या यह भी संभव है? – Ingo

उत्तर

2

यह जारी 12 अगस्त, 2014 को 1.9.6 एपइंजिन एसडीके रिलीज में हल किया गया था। MaxPermSize केवल स्थानीय dev सर्वर पर सेट किया जा सकता है।

+0

MaxPermSize केवल स्थानीय dev सर्वर पर सेट किया जा सकता है। , किस तरह? –

संबंधित मुद्दे