multithreading - java socket takes too much cpu% and virtual memory -



multithreading - java socket takes too much cpu% and virtual memory -

i have developed java socket, takes many cpu , virtual memory usages. can tell me problem in code?

private void listen() { seek { serversocket = new serversocket(port); system.out.println("server socket listening on port: " + port); system.out.println("waiting connections..."); while(true) { // take connection socket socket = serversocket.accept(); socket.setsotimeout(30000); system.out.println("got connection"); // start processing connection thread connectionmanager = new thread(new elevator(socket, socket.getinputstream()));//new thread(new connectionmanager(socket, odometer)); connectionmanager.start(); } } grab (ioexception exc) { system.out.println(listener.class.getname() + ": " + exc.getmessage()); } }

in lift class have this:

public class lift implements runnable { private string imei; private socket socket; private inputstream is; private printwriter out; private outputstream ds; private int packetl; private long timestamp; dbelevatormanipulate dbelevator; private string[] allcards = null; private string[] inscards = null; private string[] upddelcards = null; private string[] config = null; public elevator(socket socket, inputstream is) { this.socket = socket; this.is = is; initializeoutputstream(socket); } private void initializeoutputstream(socket socket) { seek { ds = socket.getoutputstream(); } grab (ioexception e) { e.printstacktrace(); } out = new printwriter(ds, true); } @override public void run(){ int codecl = 1; int imeil = 16; string codecid = ""; string imeifromboard = ""; byte[] codecbuffer = new byte[codecl]; byte[] imeibuffer = new byte[imeil]; try{ // read codec id. is.read(codecbuffer, 0, codecl); codecid = bytetostring(codecbuffer); //system.out.println("codec id : " + codecid); // read imei. is.read(imeibuffer, 0, imeil); imeifromboard = bytetostring(imeibuffer); if (codecid.equals("2")) { byte[] crc = new byte[2]; is.read(crc); byte[] cnnpacket = new byte[codecl + imeil]; cnnpacket[0] = codecbuffer[0]; (int = 1; < cnnpacket.length; i++) { cnnpacket[i] = imeibuffer[i-1]; } if(datalayer.checksum(cnnpacket, crc)) { seek { ds.write(1); ds.flush(); } grab (ioexception e) { e.printstacktrace(); } } else { seek { ds.close(); is.close(); dbelevator.disconnect(); socket.close(); } grab (ioexception e1) { e1.printstacktrace(); } return; } } } catch(exception ex) { system.out.println("error: " + ex.getmessage()); } imeifromboard = imeifromboard.substring(1, imeifromboard.length()); imei = imeifromboard; system.out.println("got connection imei:" + imei); dbelevator = new dbelevatormanipulate(imei); dbelevator.connect(); try{ while(true){ byte[] packet = new byte[1024]; int = 0; int byteread = is.read(packet); if(byteread == -1) continue; int cmdl = 1; int datalen = 2; byte[] cmdbuffer = new byte[cmdl]; byte[] lengthbuffer = new byte[datalen]; // read , print cmd. cmdbuffer[0] = packet[0]; if(cmdbuffer[0] > 9 || cmdbuffer[0] < 0){ continue; } // read , print info length. lengthbuffer[0] = packet[1]; lengthbuffer[1] = packet[2]; packetl = integer.parseint(datalayer.bytetostring(lengthbuffer)); // reading printing packet . byte[] packetbuffer = new byte[packetl]; int pcnt = 3; while(packetl-- > 0) { packetbuffer[pcnt - 3] = packet[pcnt]; pcnt++; } string packetdata = datalayer.bytetostring(packetbuffer); // reading , printing crc int crcl = 2; byte[] crcbuffer = new byte[crcl]; crcbuffer[0] = packet[pcnt]; crcbuffer[1] = packet[pcnt + 1]; if (datalayer.checksum(packetbuffer, crcbuffer)) { system.out.println("packet: ok"); switch(cmdbuffer[0]) { case 0: int nrofpackets = dbelevator.getnroftotalpackets(); int ncrc = datalayer.crc16(new byte[] {(byte)nrofpackets}); byte[] sendpacket = new byte[3]; sendpacket[0] = (byte)nrofpackets; sendpacket[1] = (byte)((ncrc >> 8) & 0xff); // hight byte of crc sendpacket[2] = (byte)(ncrc & 0xff); // low byte of crc ds.write(sendpacket); ds.flush(); allcards = dbelevator.gettotalcards().split(","); break; case 1: int packetno = integer.parseint(packetdata); if(allcards != null) sendallpacket(packetno); break; case 2: int nrofupdpackets = dbelevator.getupddelcardsno(); int updcrc = datalayer.crc16(new byte[] {(byte)nrofupdpackets}); byte[] sendupdpacket = new byte[3]; sendupdpacket[0] = (byte)nrofupdpackets; sendupdpacket[1] = (byte)((updcrc >> 8) & 0xff); // hight byte of crc sendupdpacket[2] = (byte)(updcrc & 0xff); // low byte of crc ds.write(sendupdpacket); ds.flush(); upddelcards = dbelevator.getupddelcards().split(","); break; case 3: int updpacketno = integer.parseint(packetdata); sendupddelpacket(updpacketno); break; case 4: int nrofinspackets = dbelevator.getinsertedcardsno(); int inscrc = datalayer.crc16(new byte[] {(byte)nrofinspackets}); byte[] sendinspacket = new byte[3]; sendinspacket[0] = (byte)nrofinspackets; sendinspacket[1] = (byte)((inscrc >> 8) & 0xff); // hight byte of crc sendinspacket[2] = (byte)(inscrc & 0xff); // low byte of crc ds.write(sendinspacket); ds.flush(); inscards = dbelevator.getinsertedcards().split(","); break; case 5: int inspacket = integer.parseint(packetdata); sendinspacket(inspacket); break; case 6: insertcheckinintodb(packetbuffer); break; case 7: config = dbelevator.getconfig().split(","); sendconfig(config); break; case 8: //log cards , close connection seek { if(inscards != null && inscards.length > 2) { dbelevator.resetactionforins(inscards); dbelevator.logsent_inscards(inscards); } if(upddelcards != null && upddelcards.length > 2) { dbelevator.resetactionforupd(upddelcards); dbelevator.logsent_updcards(upddelcards); } if(allcards != null && allcards.length > 2) { dbelevator.resetactionforall(allcards); dbelevator.logsent_allcards(allcards); } if(config != null && config.length > 0) { dbelevator.configsent(); } ds.close(); is.close(); dbelevator.disconnect(); system.out.println("database disconnected"); socket.close(); system.out.println("socket closed."); return; } grab (ioexception e) { e.printstacktrace(); } break; case 9: int sendconfig = dbelevator.getsendconfig(); int sendconfigcrc = datalayer.crc16(new byte[] {(byte)sendconfig}); byte[] sendconfigconfirm = new byte[3]; sendconfigconfirm[0] = (byte)sendconfig; sendconfigconfirm[1] = (byte)((sendconfigcrc >> 8) & 0xff); sendconfigconfirm[2] = (byte)(sendconfigcrc & 0xff); ds.write(sendconfigconfirm); ds.flush(); break; } }else{ //system.out.println("packet: error"); ds.write(0x00); ds.flush(); } } }catch(ioexception e){ e.printstacktrace(); } finally{ seek { ds.close(); system.out.println("ds closed."); is.close(); system.out.println("is closed."); dbelevator.disconnect(); system.out.println("db disconnected."); socket.close(); system.out.println("socket closed."); //break; } grab (ioexception e1) { e1.printstacktrace(); } } } private void sendconfig(string[] config) throws ioexception { byte[] packet = new byte[16*3]; for(int c = 0, = 0; c<32; c++) { if(c<16){ int temp = integer.parseint(config[c],2); packet[i++] = (byte)((temp >> 8) & 0xff); packet[i++] = (byte)(temp & 0xff); } else { packet[i++] = (byte)(integer.parseint(config[c]) & 0xff); } } int crc = datalayer.crc16(packet); byte[] txpacket = new byte[3*16 + 2]; for(int = 0; i<16*3; i++) { txpacket[i] = packet[i]; } txpacket[16*3] = (byte)((crc >> 8) & 0xff); txpacket[16*3 + 1] = (byte)((crc) & 0xff); ds.write(txpacket); ds.flush(); } private void insertcheckinintodb(byte[] packetdata){ string values = ""; try{ for(int = 0; i<packetdata.length; i+=8) { byte[] sitecode = new byte[1]; sitecode[0] = packetdata[i]; byte[] siteno = new byte[2]; siteno[0] = packetdata[i + 1]; siteno[1] = packetdata[i + 2]; byte[] floor = new byte[1]; floor[0] = (byte)(packetdata[i + 3] >> 4 & 0xf); byte[] valide = new byte[1]; valide[0] = (byte)(packetdata[i + 3] & 0xf); byte[] timestamp = new byte[4]; timestamp[0] = packetdata[i + 4]; timestamp[1] = packetdata[i + 5]; timestamp[2] = packetdata[i + 6]; timestamp[3] = packetdata[i + 7]; if(long.parselong(datalayer.bytetostring(timestamp)) < 1410000000) { continue; } values += "(" + imei + ","; values += datalayer.bytetostring(sitecode) + ","; values += datalayer.bytetostring(siteno) + ","; values += datalayer.bytetostring(floor) + ","; values += datalayer.bytetostring(valide) + ","; values += datalayer.bytetostring(timestamp) + "),"; } values = values.substring(0, values.length()-1); if(dbelevator.insertcheckin(values)) { ds.write(1); ds.flush(); return; } else { seek { ds.write(0); ds.flush(); } grab (ioexception e) { e.printstacktrace(); } } } catch(exception ex){ seek { ds.write(0); ds.flush(); } grab (ioexception e) { e.printstacktrace(); } } } private void sendupddelpacket(int updpacketno) throws ioexception { byte[] packet = new byte[38*6]; for(int = 0, c = 38*4*updpacketno; i<38*6; i+=6, c+=4) { if(c + 3 < upddelcards.length) { packet[i] = (byte)integer.parseint(upddelcards[c]); //system.out.println(upddelcards[c+1]); packet[i+1] = (byte)(integer.parseint(upddelcards[c+1]) >> 8 & 0xff); packet[i+2] = (byte)(integer.parseint(upddelcards[c+1]) & 0xff); packet[i+3] = (byte)(integer.parseint(upddelcards[c+2], 2) >> 8 & 0xff); packet[i+4] = (byte)(integer.parseint(upddelcards[c+2], 2) & 0xff); packet[i + 5] = (byte)integer.parseint(upddelcards[c + 3]); } else { packet[i] = 0; packet[i+1] = 0; packet[i+2] = 0; packet[i+3] = 0; packet[i+4] = 0; packet[i+5] = 0; } } int crc = datalayer.crc16(packet); byte[] txpacket = new byte[38*6 + 2]; for(int = 0; i<38*6; i++) { txpacket[i] = packet[i]; } txpacket[38*6] = (byte)((crc >> 8) & 0xff); txpacket[38*6 + 1] = (byte)((crc) & 0xff); ds.write(txpacket); ds.flush(); } private void sendinspacket(int packetno) throws ioexception { byte[] packet = new byte[46*5]; for(int = 0, c = 46*3*packetno; i< 46*5; i+=5, c+=3) { if(c + 2 < inscards.length) { packet[i] = (byte)integer.parseint(inscards[c]); packet[i+1] = (byte)(integer.parseint(inscards[c+1]) >> 8 & 0xff); packet[i+2] = (byte)(integer.parseint(inscards[c+1]) & 0xff); packet[i+3] = (byte)(integer.parseint(inscards[c+2], 2) >> 8 & 0xff); packet[i+4] = (byte)(integer.parseint(inscards[c+2], 2) & 0xff); } else { packet[i] = 0; packet[i+1] = 0; packet[i+2] = 0; packet[i+3] = 0; packet[i+4] = 0; } } int crc = datalayer.crc16(packet); byte[] txpacket = new byte[46*5 + 2]; for(int = 0; i<46*5; i++) { txpacket[i] = packet[i]; } txpacket[46*5] = (byte)((crc >> 8) & 0xff); txpacket[46*5 + 1] = (byte)((crc) & 0xff); ds.write(txpacket); ds.flush(); } private void sendallpacket(int packetno) throws ioexception { byte[] packet = new byte[46*5]; for(int = 0, c = 46*3*packetno; i< 46*5; i+=5, c+=3) { if(c + 2 < allcards.length) { packet[i] = (byte)integer.parseint(allcards[c]); packet[i+1] = (byte)(integer.parseint(allcards[c+1]) >> 8 & 0xff); packet[i+2] = (byte)(integer.parseint(allcards[c+1]) & 0xff); packet[i+3] = (byte)(integer.parseint(allcards[c+2], 2) >> 8 & 0xff); packet[i+4] = (byte)(integer.parseint(allcards[c+2], 2) & 0xff); } else { packet[i] = 0; packet[i+1] = 0; packet[i+2] = 0; packet[i+3] = 0; packet[i+4] = 0; } } int crc = datalayer.crc16(packet); byte[] txpacket = new byte[46*5 + 2]; for(int = 0; i<46*5; i++) { txpacket[i] = packet[i]; } txpacket[46*5] = (byte)((crc >> 8) & 0xff); txpacket[46*5 + 1] = (byte)((crc) & 0xff); ds.write(txpacket); ds.flush(); } private static string bytetostring(byte[] buffer) { stringbuilder s = new stringbuilder(); (byte b : buffer) { s.append((char) b); } homecoming s.tostring(); }

what can problem ? in advance.

you appear doing lot of little reads straight on socket's input stream. should improve performance if wrap input stream buffered input stream.

the utilize of buffered streams discussed in oracle java tutorial.

the output side looks bit better. assembling packets, , writing them in large(er) write calls. however, i'm still suspicious of ... , possibility of flush calls unnecessary.

as ejp points out, i/o code fragile because don't take business relationship of possibility "other end" has closed socket. cause read , equivalent calls homecoming without reading anything.

note read methods homecoming number of bytes (or characters) have read, or -1 if observe "end of stream". code ignoring homecoming value.

it possible cause of performance problems; e.g. if thread repeatedly calling read on socket in "end of stream" state.

another possible problem code listen method creating brand new thread each time accept() phone call succeeds.

if have lots of clients connecting, there lots of threads, , results in lots of resource usage. if clients don't disconnect and/or server doesn't notice have disconnected, resources leak, , server never give them back.

if leaking threads, , threads sitting idle, wasting memory. (a thread stack typically 1mb or so.) if not idle (e.g. because of bug in read code ... not dealing "end of stream" status properly) wasting cpu too.

@chanjaster suggested using executor fixed sized thread pool. might help in couple of respects:

it prevents application using unbounded number of threads. it recycles threads after no longer active ... reduces overheads.

however, if have resource leakage problem, thread pool won't cure this. indeed, happen new connections freeze. (they go task queue waiting worker thread pick them up. , never happens.)

java multithreading sockets memory-management cpu-usage

Comments

Popular posts from this blog

formatting - SAS SQL Datepart function returning odd values -

c++ - Apple Mach-O Linker Error(Duplicate Symbols For Architecture armv7) -

php - Yii 2: Unable to find a class into the extension 'yii2-admin' -