Google app engine 在GAE 1.7.3中使用DeferredTasks时PermGen空间不足
最近我切换到谷歌应用引擎Java SDK1.7.3。从那时起,每次提交到任务队列时,我的PermGen空间都会用完Google app engine 在GAE 1.7.3中使用DeferredTasks时PermGen空间不足,google-app-engine,memory-leaks,task-queue,permgen,Google App Engine,Memory Leaks,Task Queue,Permgen,最近我切换到谷歌应用引擎Java SDK1.7.3。从那时起,每次提交到任务队列时,我的PermGen空间都会用完 将应用程序部署到应用程序引擎时不会发生这种情况。它只在本地发生。但它阻碍了我的本地测试,并使集成测试失败 它发生在MacOSX 10.7.5和Java6上 $ java -version java version "1.6.0_37" Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909) Java Ho
- 将应用程序部署到应用程序引擎时不会发生这种情况。它只在本地发生。但它阻碍了我的本地测试,并使集成测试失败
- 它发生在MacOSX 10.7.5和Java6上
$ 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)
- 这是问题发生时我看到的stacktrace的一部分
其他人能复制这个吗?谢谢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
更新:我在GAE的谷歌代码页上创建了此问题。此问题已于2014年8月12日在1.9.6 AppEngine SDK版本中得到解决。
MaxPermSize只能在本地开发服务器上设置。为什么不使用XXMaxPermSize JVM arg增加内存量呢?首先,我认为我的应用程序/GAE本身出了问题。我没有做什么特别的事情,我想知道为什么我的PermGen空间用完了。我实际上是在启动GAE并调用一个URL来添加延迟任务。其次,我使用的是maven gae插件。(1)将XXMaxPermSize添加到MAVEN_选项中,(2)将其添加到。。maven的gae插件不会改变PermGen空间的大小。Maven启动的运行GAE的JVM没有接收到这一点。在GAE中运行时,我们如何增加PermGen空间?这可能吗?您不能更改服务器上的实例配置。只能对本地开发环境执行此操作。只能在本地开发服务器上设置MaxPermSize,怎样?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"); } } } }