This is broadly right, but the allusion to "exactly that many references" is wrong. The Channel and Pipeline and ChannelHandlerContext objects all have mutual backreferences of various kinds.
Strictly speaking the answer is x to y, where x is the number of times bind has been called. In most programs, however, x is 1.
The serverChannelInit is called exactly once per bind, and it sets up the server channel. The server channel then handles each new inbound connection, configuring it and setting up its channel, before relinquishing it. We never spawn new ones without user input, regardless of backlog or load.
Not quite. DatagramBootstrap produces DatagramChannels. NIO's model of a DatagramChannel does not require it to be connected, and when it isn't it can send packets to and receive packets from any address. When operating in this mode, a single DatagramChannel can handle potentially all of the datagrams sent or received by an entire program.
Optionally, the DatagramChannel may be connected. In this case, it can only send and receive packets to the address to which it is connected. In that case, different Channels may be handling packets sent to the same local address/port combo.
You should not analogise DatagramBootstrap to ServerBootstrap: NIO does not have a built-in way to have a datagram "server" today. We could build such a thing though, by using connected mode.
Yes, that's the intention. This is typically required only in the absolutely highest load servers, where it is possible that you are receiving inbound connections so fast that accept burns an entire thread to process, or alternatively that you are so heavily slammed processing data that you can't accept new ones on your other threads.
In general, NIO is fast enough that the vast majority of programs using it only want to give it one thread. This is why you don't see it used anywhere: it's absolutely a last 0.1% solution.
Assuming that bind was called only once, it's 1 server channel and 4 child channels.
Correct: 1 server channel, 1 connection channel, 16 HTTP/2 stream channels, forming a tree. The parent of each stream channel is the connection channel, and the parent of the connection channel is the server channel.
(Sidebar: NIO's Channels have a parent property that you can use to walk this tree.)
Correct.