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