socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?
我創建了一個線程池并為它提供了50個連接到服務器的任務.所以一旦完成連接,發送一些數據,然后斷開連接.它的讀取超時設置為5秒(當然是5000長).我甚至將線程池設置為最大大小為1.然后在
linux上啟動它,然后運行htop(更好的top版本)來檢查CPU使用率.我一直在100%看到我的一個核心(2核心機器).我用hprof(-agentlib:hprof = cpu = samples,interval = 20,depth = 3)對此進行了分析,并將socket.connect()設置為99%.
這是我覺得奇怪的,是不是阻止IO阻止(因此等待)?我的JDK是(來自java -version):
OpenJDK運行時環境(IcedTea6 1.6.1)(6b16-1.6.1-3ubuntu3)
OpenJDK Server VM(build 14.0-b16,混合模式)
Update1:??Sun的JVM也出現同樣的問題:
java -version
Java version "1.6.0_20"
Update2:這是由于本地的doConnect方法.任何人都知道如何查看此本機/ C代碼的來源?
Update3:我登錄windows編寫代碼并測試它.它工作正常,沒有CPU資源被沖洗.我重新登錄到linux,現在問題仍然在這里,但不是像整個CPU核心那樣只需1次連接就可以了.這是代碼:
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SocketTest {
public static void main(String[] args) {
new SocketTest();
}
public SocketTest() {
ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newFixedThreadPool(40);
Vector> tasks = new Vector>();
for (int i = 0; i < 1500; i++)
tpe.submit(new Thread() {
public void run() {
byte[] ip = { 74, 125, 19, (byte)((Math.random()*253)+1)};
Socket socket = new Socket();
try {
System.out.println("new thread: "+ip[3]);
socket.connect(new InetSocketAddress(InetAddress.getByAddress(ip), 80), 3000);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
//no need to print
}
}
});
try {
tpe.invokeAll(tasks);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("test");
try {
//too lazy to write actual code to wait for task completness...
tpe.awaitTermination(9001, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test2");
}
}
總結
以上是生活随笔為你收集整理的socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ospf 命令,OSPF单区
- 下一篇: 在日常生活中,经常会遇到某些需求对文件名