java.net.SocketInputStream上的StackOverflowError

时间:2018-02-12 11:48:43

标签: java jsoup stack-overflow java-9

我的系统 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()

欢迎任何建议

1 个答案:

答案 0 :(得分:0)

StackOverflowError表示您已经耗尽了调用堆栈。堆栈,如在计算机编程中使用的众所周知的数据结构(许多语言,而不仅仅是java)。

每次调用方法时,条目都会添加到调用堆栈中。每次被调用的方法终止时,都会从堆栈中删除条目。堆栈的大小有限(虽然通常非常大),因此您可以完全填充它。

所以它看起来像 - 我猜你因为你没有提供你的代码 - 你正在调用很多方法而且它们都没有终止。

近十年前的其他Stack Overflow question可能会对你有帮助。