Dieses VM -Argument half:
-Dsun.net.maxDatagramsockets = 101
Frage
Ich habe die Java -App mit einer benutzerdefinierten Sicherheitsrichtlinie und als ich versucht habe, 100 UDP -Sockets zu öffnen, habe ich Ausnahme:
java.net.SocketException: maximum number of DatagramSockets reached
Test App:
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.util.ArrayList;
import java.util.List;
public class Test {
static int basePortNum = 40000;
public static void main(String[] args) {
List<DatagramSocket> socks = new ArrayList<DatagramSocket>();
try{
for(int i = 0; i<100; i++){
socks.add(new DatagramSocket(basePortNum+i, Inet4Address.getByName("127.0.0.1")) );
System.out.println(i);
}
}catch(Exception e){
e.printStackTrace();
}finally{
for(java.net.DatagramSocket soc: socks){
soc.close();
}
}
}
}
Wenn ich es ohne Sicherheitsmanager starte, wird alle 100 Sockets erstellt:
0
1
...
98
99
Aber wenn ich diese Zeile zu VM -Argumenten hinzufüge
-Djava.security.manager
Es scheitert auch bei Standardsicherheitsrichtlinien:
0
1
...
23
24
java.net.SocketException: maximum number of DatagramSockets reached
at sun.net.ResourceManager.beforeUdpCreate(ResourceManager.java:53)
at java.net.PlainDatagramSocketImpl.create(PlainDatagramSocketImpl.java:74)
at java.net.DatagramSocket.createImpl(DatagramSocket.java:318)
at java.net.DatagramSocket.<init>(DatagramSocket.java:209)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at Test.main(Test.java:16)
Wie kann ich die Socket -Grenze ändern, während ich den Sicherheitsmanager benutze?
UPD: Es wurde unter Windows 8.1 X64, Windows 7 X64 und Windows XP SP3 X32, Windows 7 X32 reproduziert. Auf allen Systemen wurde JDK 1.6.45 x32 verwendet.
UPD2: Unter Windows XP SP3 X32 reproduziert auch mit JDK7, kann dies jedoch nicht mit JDK 1.6.27 reproduzieren.
UPD3: Debugging JDK -Klassen fand Folgendes:
// Compiled from ResourceManager.java (version 1.5 : 49.0, super bit)
public class sun.net.ResourceManager {
// Field descriptor #14 I
private static final int DEFAULT_MAX_SOCKETS = 25;
In der Open JDK -Implementierung beträgt das Standard -Socket -Limit 1024http://www.docjar.com/html/api/sun/net/resourcemanager.java.html
Lösung
Dieses VM -Argument half:
-Dsun.net.maxDatagramsockets = 101