¿Por qué el tamaño máximo del byte [] 2 GB - 57 B?

En mi máquina de 64 bits, este código C # funciona:

new byte[2L * 1024 * 1024 * 1024 - 57]

pero este arroja unOutOfMemoryException:

new byte[2L * 1024 * 1024 * 1024 - 56]

¿Por qué

Entiendo que el tamaño máximo de un objeto administrado es de 2 GB y que el objeto de matriz que estoy creando contiene más de los bytes que quiero. Es decir, hay 4 bytes (u 8?) Para el número de bloque de sincronización, 8 bytes para la referencia de la tabla de métodos y 4 bytes para el tamaño de la matriz. Eso es 24 bytes, incluido el relleno, así que ¿por qué no puedo asignar una matriz con 2G - 24 bytes? ¿El tamaño máximo es realmenteexactament 2 GB? Si ese es el caso, ¿para qué se usa el resto de 2 GB?

Nota: en realidad no necesito asignar una matriz con 2 millones de bytes. E incluso si lo hiciera, 56 bytes es una sobrecarga insignificante. Y podría superar el límite fácilmente usando customBigArray<T>.

Respuestas a la pregunta(2)

Su respuesta a la pregunta