【问题标题】:Thread getting locked at "www.protocol.http.HttpURLConnection"线程被锁定在“www.protocol.http.HttpURLConnection”
【发布时间】:2012-08-24 11:48:52
【问题描述】:

我的线程在调用时被锁定

new URL(url).openConnection();

线程转储的一部分是:

sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
    - locked <0x00000007056a2498> (a sun.net.www.protocol.http.HttpURLConnection)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)

似乎被锁定在

"JakartaHttpHandler-http-timeout-pool-12-thread-1" daemon prio=10 tid=0x0000000046bb6800 nid=0x162 waiting on condition [0x00000000431b7000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000007521c68b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

到底堆细节说,

compacting perm gen  total 41408K, used 41295K [0x00000007fae00000, 0x00000007fd670000, 0x0000000800000000)
   the space 41408K,  99% used [0x00000007fae00000, 0x00000007fd653e58, 0x00000007fd654000, 0x00000007fd670000)

线程不会在不抛出任何异常的情况下继续运行。

首先,我打算更改-XX:MaxPermSize。我还有什么可以做的吗?

我敢肯定,人们一定遇到过这个例外。

提前致谢。

【问题讨论】:

    标签: java threadpool httpurlconnection heap-dump thread-dump


    【解决方案1】:

    有没有可能你真的被困在更远的“connect()”调用中?

    您要查找的代码可能更接近:

        HttpURLConnection connection = new URL(url).openConnection();
        connection.setConnectTimeout(10000);
        connection.setReadTimeout(10000);
        connection.connect();
    

    这将创建连接对象,将其设置为 10 秒的连接超时(尝试与远程主机建立连接)和 10 秒的读取超时(等待响应所花费的时间)。如果您的网络速度非常慢,可以想象第一个可能需要更高。如果您的服务由于对某些资源的长时间操作而需要一段时间来响应,则可能需要增加第二个。在任何情况下,默认值都是无穷大,这对于任何生产系统都可能不是一个好主意。

    【讨论】:

      【解决方案2】:

      在堆栈跟踪中往上走一点。您的应用程序可能正在打开与外部网站(例如 SpringFramework.org)的连接,以获取 XSD。

      查看这些网站是什么,并检查是否可以使用 wget 从部署您的应用程序的机器访问它们。

      【讨论】:

      • 这种情况下不应该超时吗?线程卡住了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2023-03-21
      • 2013-12-21
      • 2011-05-20
      • 2018-11-02
      相关资源
      最近更新 更多