Ik ben bezig met het verbouwen van de freeware socketserver AquaServer...een nogal simpel servertje, naar een socket broadcast server. dit voor een flash project.
Ik heb nu een test flash die 2000 connecties naar de server opent. Helaas crashed de dikke machine (ja, echt een dikke machine) al gauw (rond de 800 verbindingen) met de volgende melding :
Dit doet hij ook als hij niet eerst out of memory had. At random lijkt hij referenties naar clientThreads vallen uit de vector ClientList. Deze referenties blijven vervolgens hard staan......
Hier de volgens mij belanrijkste code:
Aangezien beiden fouten alleen bij hogere volumes plaatsvinden lijkt het een pure performance issue. Iemand enig idee?
Code is erg geknipt, en zal ook zo niet compileren. Gaat er eigenlijk om dat ik allen wil laten zien welke techniek ik gebruik. Ik heb zo'n gevoel dat er een hoop fout gaat in de clientlist vector. Aangezien beide errors daaraan gerelateerd lijken te zijn. Ik vraag me af of er een manier is om efficienter de verbindingen bij te houden. Ik vraag me dan ook meer af waarom dit al in elkaar klapt op een miezerige 800 verbindingen op toch een redelijke zware sun bak (op een 155Mbit lijn).
Ik heb nu een test flash die 2000 connecties naar de server opent. Helaas crashed de dikke machine (ja, echt een dikke machine) al gauw (rond de 800 verbindingen) met de volgende melding :
Java:
1
2
| java.lang.OutOfMemoryError Exception in thread "main" java.lang.OutOfMemoryError |
Java:
1
2
3
4
5
6
7
8
9
10
| java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 744 at java.util.Vector.remove(Vector.java:796) at AquaServer.deleteClient(aquaserver.java:115) at AquaClientThread.run(aquaserver.java:210) at java.lang.Thread.run(Thread.java:536) java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 54 at java.util.Vector.remove(Vector.java:796) at AquaServer.deleteClient(aquaserver.java:115) at AquaClientThread.run(aquaserver.java:210) at java.lang.Thread.run(Thread.java:536) |
Dit doet hij ook als hij niet eerst out of memory had. At random lijkt hij referenties naar clientThreads vallen uit de vector ClientList. Deze referenties blijven vervolgens hard staan......
Hier de volgens mij belanrijkste code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public class AquaServer { static Vector clientList= new Vector(); static Vector adminList= new Vector(); [......] public static void main(String[] args) throws IOException { if (args.length >= 2){ [...] serverSocket = new ServerSocket(worldPort.intValue()); tempCommand = new CommandReader(); tempCommand.start(); while (listening){ try{ tempClient = new AquaClientThread(serverSocket.accept()); clientList.add(tempClient); tempThread = new Thread(tempClient); tempThread.start(); } static void deleteClient(AquaClientThread deadClient){ int num; num=clientList.indexOf(deadClient); clientList.remove(num); } } |
Aangezien beiden fouten alleen bij hogere volumes plaatsvinden lijkt het een pure performance issue. Iemand enig idee?
Code is erg geknipt, en zal ook zo niet compileren. Gaat er eigenlijk om dat ik allen wil laten zien welke techniek ik gebruik. Ik heb zo'n gevoel dat er een hoop fout gaat in de clientlist vector. Aangezien beide errors daaraan gerelateerd lijken te zijn. Ik vraag me af of er een manier is om efficienter de verbindingen bij te houden. Ik vraag me dan ook meer af waarom dit al in elkaar klapt op een miezerige 800 verbindingen op toch een redelijke zware sun bak (op een 155Mbit lijn).
[ Voor 80% gewijzigd door Verwijderd op 18-06-2003 16:27 . Reden: knip knip ]