我们正在将应用程序从Java 6迁移到Java7。从总体上讲,问题在于它的速度较慢。

更详细地讲,由于探查器告诉我们热点,我们一直在升级类(class)。至此,当使用java.net.SocketInputStream.socketRead0(Native Method)的采样器时,我们显示了jvisualvm占42%的使用率。

在执行线程转储时,许多线程都有此堆栈

"RMI TCP Connection(68)-192.168.1.198" daemon prio=5 tid=0x00007ff3279f3800 nid=0x49d2b runnable [0x000000013e279000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    - locked <0x00000007f881b7f0> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(FilterInputStream.java:83)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:538)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - <0x0000000763e82c50> (a java.util.concurrent.ThreadPoolExecutor$Worker)

我对此的理解是该应用程序卡在响应上。我无法确定它是来自数据库还是来自测试端点。我们模仿http请求,并在测试中在我们的应用程序中对它们进行射击。

在Google上搜索,我尝试设置以下属性:
-Dsun.rmi.transport.tcp.responseTimeout=5000-Djava.net.preferIPv4Stack=true
没有任何效果。

以下是与我们的设置有关的简要说明
  • Centos或Mac(都有问题)
  • mysql 5.1.73
  • c3po
  • hibernate 4.3.6

  • 有任何想法吗?

    最佳答案

    我不知道此套接字通信的上下文是什么,但是很可能您看到的数字并不是真正的问题...

  • 如果线程一直连接到套接字,则在可用时读取数据并进行处理,那么通常会发现socketRead0的使用率很高。这只是意味着42%的时间没有数据可用于处理,因此socketRead0阻塞了等待数据的时间(因此42%的线程处于 Activity 状态的时间都花在socketRead0方法中)。实际上,在这种情况下,我会建议将处理数据和读取数据拆分为两个单独的线程(这将使读取线程在socketRead0中报告更高的使用率)。
  • 如果socketRead0是临时“查询”的结果(也就是说,您的代码正在通过套接字连接定期请求数据),则42%只是这些数据请求所花费的时间(包括时间)远程过程需要花费大量时间才能生成数据,还需要花费一些时间来通过网络读取数据)。如果此时间过多,则需要考虑加快套接字另一端的速度,或提高其吞吐量和/或延迟)。
  • 09-11 16:52