1. Overview

java.net.SocketException: maximum number of DatagramSockets reached 발생 원인과 해결책



2. Descriptions

java.net.DatagramSocket.createImpl() 을 통해 Datagram Socket을 과도하게 생성 시 발생한다.

1
2
3
4
5
6
7
java.net.SocketException: maximum number of DatagramSockets reached
       at sun.net.ResourceManager.beforeUdpCreate(ResourceManager.java:73)
       at java.net.AbstractPlainDatagramSocketImpl.create(AbstractPlainDatagramSocketImpl.java:83)
       at java.net.DatagramSocket.createImpl(DatagramSocket.java:337)
       at java.net.DatagramSocket.<init>(DatagramSocket.java:239)
       at java.net.DatagramSocket.<init>(DatagramSocket.java:196)
       at ...


고객은 Oracle JDK 1.8 환경이지만 Open JDK 1.8 에서도 동일 소스 코드 구간을 확인할 수 있다.

ResourceManager.java 의 코드 중 73 라인을 주목하면,

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
28
29
30
public class ResourceManager {

	...
	
    private static final int DEFAULT_MAX_SOCKETS = 25;
    private static final int maxSockets;
    private static final AtomicInteger numSockets;

    static {
        String prop = java.security.AccessController.doPrivileged(
            new GetPropertyAction("sun.net.maxDatagramSockets")
        );
        int defmax = DEFAULT_MAX_SOCKETS;
        try {
            if (prop != null) {
                defmax = Integer.parseInt(prop);
            }
        } catch (NumberFormatException e) {}
        maxSockets = defmax;
        numSockets = new AtomicInteger(0);
    }

    public static void beforeUdpCreate() throws SocketException {
        if (System.getSecurityManager() != null) {
            if (numSockets.incrementAndGet() > maxSockets) {
                numSockets.decrementAndGet();
                throw new SocketException("maximum number of DatagramSockets reached");		<<< 73 line
            }
        }
    }


SecurityManager가 활성화된 환경에서는 최대 25개의 Datagram socket을 생성 제한이 존재한다.

혹은 -Dsun.net.maxDatagramSocket 옵션을 통해 이를 무시하고 더 많은 Datagram socket을 생성할 수 있다.



3. References

java.net.SocketException: maximum number of DatagramSockets reached - KB918981