Java 应用程序似乎挂在SocketRead上
我们正在将一个应用程序从Java6迁移到Java7。在高层,问题是它的速度较慢 更详细地说,我们已经按照分析器告诉我们的热点升级了类。此时,我们有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
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%就是这些数据请求所花费的时间量(包括远程进程生成数据和通过网络读取数据所花费的时间)。如果这段时间太长,您需要考虑加快套接字的另一端,或者加快其吞吐量和/或延迟)