Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序似乎挂在SocketRead上_Java_Sockets_Rmi - Fatal编程技术网

Java 应用程序似乎挂在SocketRead上

Java 应用程序似乎挂在SocketRead上,java,sockets,rmi,Java,Sockets,Rmi,我们正在将一个应用程序从Java6迁移到Java7。在高层,问题是它的速度较慢 更详细地说,我们已经按照分析器告诉我们的热点升级了类。此时,我们有java.net.SocketInputStream.socketRead0(本机方法)在使用jvisualvm的采样器时显示了42%的使用率 在执行线程转储时,许多线程都具有此堆栈 "RMI TCP Connection(68)-192.168.1.198" daemon prio=5 tid=0x00007ff3279f3800 nid=0x49d

我们正在将一个应用程序从Java6迁移到Java7。在高层,问题是它的速度较慢

更详细地说,我们已经按照分析器告诉我们的热点升级了类。此时,我们有
java.net.SocketInputStream.socketRead0(本机方法)
在使用
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)
“RMI TCP连接(68)-192.168.1.198”守护程序prio=5 tid=0x00007ff3279f3800 nid=0x49d2b runnable[0x000000013e279000]
java.lang.Thread.State:可运行
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(SocketInputStream.java:152)
位于java.net.SocketInputStream.read(SocketInputStream.java:122)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:235)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:254)
-锁定(java.io.BufferedInputStream)
位于java.io.FilterInputStream.read(FilterInputStream.java:83)
位于sun.rmi.transport.tcp.tcpttransport.handleMessages(tcpttransport.java:538)
位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0(tcpttransport.java:811)
位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run(tcpttransport.java:670)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:745)
锁定可拥有的同步器:
-(一个java.util.concurrent.ThreadPoolExecutor$Worker)
我的理解是,应用程序正在等待响应。我不知道这是来自数据库还是来自测试端点的响应。我们模拟http请求,并在测试中向应用程序发送它们

通过谷歌搜索,我尝试设置以下属性:

-Dsun.rmi.transport.tcp.responseTimeout=5000

-Djava.net.preferIPv4Stack=true

没有效果

下面是与我们的设置相关的内容的简要说明

  • Centos或Mac(两者都有问题)
  • mysql 5.1.73
  • c3po
  • 休眠4.3.6

有什么想法吗?

我不知道这个套接字通信的上下文是什么,但您看到的数字很可能不是什么问题

  • 如果线程一直连接到套接字,在可用时读取数据并对其进行处理,那么socketRead0的使用率很高是正常的。这只意味着42%的时间没有数据可供处理,因此socketRead0阻塞等待数据(因此线程活动的42%时间都在socketRead0方法内)。事实上,在本例中,我将重新编译将处理数据和读取数据拆分为两个单独的线程(这将使读取线程在socketRead0中报告更高的使用率)

  • 如果socketRead0是临时“查询”的结果(即,您的代码通过套接字连接定期请求数据),那么42%就是这些数据请求所花费的时间量(包括远程进程生成数据和通过网络读取数据所花费的时间)。如果这段时间太长,您需要考虑加快套接字的另一端,或者加快其吞吐量和/或延迟)