Para poder usar los 4GB de RAM tendrías que usar un JDK de 64 bits, ya que no sólo el S.O. ha de ser de 64 bits, también lo ha de ser el JDK. No te dejará ponerle más de 1.536MB por que entre eso y lo que consume la propia JVM, llegarás a los 2GB del máximo de un proceso de 32 bits.
Si necesitas tener toda la matriz en memoria entonces según lo que metas en cada posicion de la matriz... esta claro que en cuanto te descuides te pasas del limite. Para N=18.000 tienes 648.000.000 de posiciones en la matriz. Si lo llenas únicamente de int, eso son, mínimo, 4 bytes por posicion = 2.592.000.000 bytes.... y eso sólo para la matriz, así que echa cuentas...
.
Tenerla accesible fácilmente no significa tener que tenerla en memoria, al menos no con estas magnitudes. Una solución es manejar tu la gestión de lo que hay en memoria y lo que hay en disco y otra usar Memory-Mapped Files. No es trivial usarlos pero con esos requerimientos que tienes, no lo puedes solucionar de forma trivial.
Suerte.