Java URLFetchServiceFactory.getURLFetchService().fetch处的StackOverflower错误
我的应用程序使用GAE提供的API:Java URLFetchServiceFactory.getURLFetchService().fetch处的StackOverflower错误,java,google-app-engine,Java,Google App Engine,我的应用程序使用GAE提供的API: URLFetchServiceFactory.getURLFetchService().fetch 它在devserver上运行,但在30到60分钟(时间不同)后,它开始抛出StackOverflowerError 调用标准web URL的fetch实际上会以何种方式导致URLFetchServiceFactory.getURLFetchService().fetch抛出错误 这是完整日志:(long)完整日志中的堆栈深度有一个非常可疑的值1025=102
URLFetchServiceFactory.getURLFetchService().fetch
它在devserver
上运行,但在30到60分钟(时间不同)后,它开始抛出StackOverflowerError
调用标准web URL的fetch
实际上会以何种方式导致URLFetchServiceFactory.getURLFetchService().fetch
抛出错误
这是完整日志:(long)完整日志中的堆栈深度有一个非常可疑的值1025=1024+1 仔细观察就会发现您有这样一个重复的递归调用序列:
[INFO] at java.io.File.isDirectory(File.java:844)
[INFO] at sun.net.www.ParseUtil.fileToEncodedURL(ParseUtil.java:269)
[INFO] at sun.security.provider.PolicyFile.canonicalizeCodebase(PolicyFile.java:1735)
[INFO] at sun.security.provider.PolicyFile.access$700(PolicyFile.java:258)
[INFO] at sun.security.provider.PolicyFile$5.run(PolicyFile.java:1188)
[INFO] at sun.security.provider.PolicyFile$5.run(PolicyFile.java:1186)
[INFO] at java.security.AccessController.doPrivileged(Native Method)
[INFO] at sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1185)
[INFO] at sun.security.provider.PolicyFile.getPermissions(PolicyFile.java:1132)
[INFO] at sun.security.provider.PolicyFile.implies(PolicyFile.java:1086)
[INFO] at com.google.appengine.tools.development.IsolatedAppClassLoader$ProxyPolicy$2.run(IsolatedAppClassLoader.java:418)
[INFO] at com.google.appengine.tools.development.IsolatedAppClassLoader$ProxyPolicy$2.run(IsolatedAppClassLoader.java:415)
[INFO] at java.security.AccessController.doPrivileged(Native Method)
[INFO] at com.google.appengine.tools.development.IsolatedAppClassLoader$ProxyPolicy._implies(IsolatedAppClassLoader.java:415)
[INFO] at com.google.appengine.tools.development.IsolatedAppClassLoader$ProxyPolicy.implies(IsolatedAppClassLoader.java:42005)
[INFO] at java.security.ProtectionDomain.implies(ProtectionDomain.java:285)
[INFO] at java.security.AccessControlContext.checkPermission(AccessControlContext.java:450)
[INFO] at java.security.AccessController.checkPermission(AccessController.java:884)
[INFO] at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
[INFO] at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:429)
[INFO] at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
[INFO] at java.io.File.isDirectory(File.java:844)
... repeating 49 times or so
我不是Java用户,但如果我正确地解释它,您可能正在处理一个目录结构太深
如果是这样,请重新安排目录结构或修改代码,以限制其一次插入的深度。经过几个小时的挖掘,我发现了StackOverflower错误的罪魁祸首,显然是调用fetch之前的for循环导致了这一点,如下所示:
List<String> cachedLinks = (List<String>) memcache.get(url);
for(String link : cachedLinks) { // size range from 0 to 1000 or more...
// Do something
}
// then a bit later
URLFetchServiceFactory.getURLFetchService().fetch(...);
List cachedLinks=(List)memcache.get(url);
对于(字符串链接:cachedLinks){//大小范围从0到1000或更多。。。
//做点什么
}
//然后过一会儿
URLFetchServiceFactory.getURLFetchService().fetch(…);
然而,cachedLinks
包含数千个字符串值。删除for循环停止抛出堆栈溢出错误
也许Java大师可以更好地解释这种现象,以及为什么在调用fetch
call之前会出现for循环