Comportamento estranho do Java OutOfMemoryError

Assumindo que temos uma memória máxima de 256M, por que esse código funciona:

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

mas esse aqui joga um OOME?

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

questionAnswers(2)

yourAnswerToTheQuestion