StackOverflowError at URLFetchServiceFactory.getURLFetchService (). Fetch - PullRequest
0 голосов
/ 28 апреля 2018

Мое приложение использует этот API от GAE:

URLFetchServiceFactory.getURLFetchService().fetch

, который работает на devserver, но через 30-60 минут (время меняется) начинает выдавать StackOverflowError.

Каким образом вызов fetch по стандартному веб-URL может на самом деле вызвать URLFetchServiceFactory.getURLFetchService().fetch SO ошибку.

Вот полный журнал: https://pastebin.com/WCcmXCH3 (длинный)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Я обнаружил виновника ошибки StackOverflowError после нескольких часов копания, по-видимому, цикла for перед вызовом fetch, вот так:

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(...);

Принимая во внимание, что cachedLinks содержит тысячи строковых значений. Снятие петли for прекратило бросание StackOverflowError.

Возможно, гуру Java может лучше объяснить этот феномен и почему цикл for выше вызова fetch call.

0 голосов
/ 28 апреля 2018

Глубина стека в полном журнале имеет очень подозрительное значение 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, но если я правильно его интерпретирую, возможно, вы слишком глубоко обрабатываете структуру каталогов.

Если это так, либо измените структуру каталогов, либо измените свой код, чтобы ограничить его глубину за один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...