我的系统
Debian 9
java --version
java 9.0.4
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
我运行我的程序(它可以并行抓取)并且过了一段时间我得到了:
java.lang.StackOverflowError
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:746)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:2074)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:854)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:859)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:859)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:859)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:859)
... lots of repeating in this stack trace without any reference to my code
之后:
Starting coordinated shutdown from JVM shutdown hook
这就是结束。
我正在使用最新的jsoup
,但我认为这个bug与JDK有关,我不知道如何处理这个问题。
jsoup code / scala(可能相关也可能不相关)
val con = Jsoup.connect(url)
con.headers(headers.asJava)
con.userAgent(agent)
con.followRedirects(true)
con.validateTLSCertificates(false)
con.ignoreHttpErrors(true)
con.maxBodySize(1024 * 1024 * 3)
con.cookies(lastCookies.asJava)
con.referrer(referrer)
_setup.map(_.proxy.toProxy).foreach(con.proxy)
con.timeout(connectionTimeout.toMillis.toInt)
val r = con.execute()
lastCookies = r.cookies().asScala.toMap[String, String]
val parsed = r.parse()
欢迎任何建议
答案 0 :(得分:0)
StackOverflowError
表示您已经耗尽了调用堆栈。堆栈,如在计算机编程中使用的众所周知的数据结构(许多语言,而不仅仅是java)。
每次调用方法时,条目都会添加到调用堆栈中。每次被调用的方法终止时,都会从堆栈中删除条目。堆栈的大小有限(虽然通常非常大),因此您可以完全填充它。
所以它看起来像 - 我猜你因为你没有提供你的代码 - 你正在调用很多方法而且它们都没有终止。
近十年前的其他Stack Overflow question可能会对你有帮助。