Port Availability Scanner, written in Java (9)
Why do you create a million element array? (int[] ports = new int[1_000_000]) It'd better to make it as large as the ports in constructor (end-start or ports.length)
Why all of this code?

if(ports.length &gt; 1) {
    for (int port : ports) {
        System.out.println("Available " + port + ": " + Test.isAvailable(port));
    }
} else if(ports.length == 1) {
    System.out.println("Available " + ports[0] + ": " + Test.isAvailable(ports[0]));
} else {
    throw new IllegalStateException();
}


You only really need

for (int port : ports) {
    System.out.println("Available " + port + ": " + Test.isAvailable(port));
}


The result will be equivalent and the code is now more readable
Why did you make ip and instance static? Do you want to make the class a singleton?
The ports label is unnecessary in the first constructor
Use InetAddress instead of String for IPs' as from what I know Sockets convert the strings into InetAdresses anyway. It should somewhat improve performance (change ip variable from String to InetAddress so you don't recreate the address on and on again)
Shouldn't this:

try {
    socket = new Socket(ip, port);
    return false;
} catch (IOException e) {
    return true;
} finally {
    if(socket != null) {
        try {
            socket.close();
        } catch (IOException ignored) { }
    }
}


work the other way round? Why method isAvailable returns true when the 
socket throws a exception? Looks like a bug to me I misunderstood what you 
meant by available. Your code is correct