Java OutOfMemoryError comportamiento extraño

Suponiendo que tenemos una memoria máxima de 256M, ¿por qué funciona este código:

public static void main(String... args) {
  for (int i = 0; i < 2; i++)
  {
      byte[] a1 = new byte[150000000];
  }
  byte[] a2 = new byte[150000000];
}

pero este lanza un OOME?

public static void main(String... args) {
  //for (int i = 0; i < 2; i++)
  {
      byte[] a1 = new byte[150000000];
  }
  byte[] a2 = new byte[150000000];
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta