socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?
我創(chuàng)建了一個(gè)線程池并為它提供了50個(gè)連接到服務(wù)器的任務(wù).所以一旦完成連接,發(fā)送一些數(shù)據(jù),然后斷開(kāi)連接.它的讀取超時(shí)設(shè)置為5秒(當(dāng)然是5000長(zhǎng)).我甚至將線程池設(shè)置為最大大小為1.然后在
linux上啟動(dòng)它,然后運(yùn)行htop(更好的top版本)來(lái)檢查CPU使用率.我一直在100%看到我的一個(gè)核心(2核心機(jī)器).我用hprof(-agentlib:hprof = cpu = samples,interval = 20,depth = 3)對(duì)此進(jìn)行了分析,并將socket.connect()設(shè)置為99%.
這是我覺(jué)得奇怪的,是不是阻止IO阻止(因此等待)?我的JDK是(來(lái)自java -version):
OpenJDK運(yùn)行時(shí)環(huán)境(IcedTea6 1.6.1)(6b16-1.6.1-3ubuntu3)
OpenJDK Server VM(build 14.0-b16,混合模式)
Update1:??Sun的JVM也出現(xiàn)同樣的問(wèn)題:
java -version
Java version "1.6.0_20"
Update2:這是由于本地的doConnect方法.任何人都知道如何查看此本機(jī)/ C代碼的來(lái)源?
Update3:我登錄windows編寫代碼并測(cè)試它.它工作正常,沒(méi)有CPU資源被沖洗.我重新登錄到linux,現(xiàn)在問(wèn)題仍然在這里,但不是像整個(gè)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");
}
}
總結(jié)
以上是生活随笔為你收集整理的socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux ospf 命令,OSPF单区
- 下一篇: Java中stringbutter_ja