Teoria do funcionamento da JVM - desempenho e uso de memória

Galera, faz um tempo que eu estava conversando com um amigo e uma vez ele me veio com essas afirmações (coloquei exemplo para facilitar)
Exemplo 1:

int a = 0; for(int e = 0; e < 9999; e++) { a = e; }
Exemplo 2:

for(int e = 0; e < 9999; e++) { int a = e; }

Primeira afirmação:
Ao usar o exemplo 2, jamais vai ocorrer um erro de falta de memória no Java, pois toda vez que o while acaba a var "a" é excluída junto com seu conteúdo.
Já no exemplo 1, pode ocorrer o erro, pois a variável nunca é excluída. Segundo ele, todos os valores anteriores que a variável possuía também ficam guardados na memória. Ex: se eu tiver na repetição 10 do while:
A var "a" vai ter valor 9 e dentro da memória RAM vão estar guardados os valores 0, 1, 2, 3, 4, 5, 6, 7 e 8 (mesmo que não acessíveis) (eu duvidei disso mas, como não conhecia, não fiquei teimando)

Segunda afirmação:
O exemplo 1 é mais rápido que o 2, pois no 1 o Java só precisa alterar o valor da variável a cada nova repetição do while. No 2 o Java precisa criar a variável, alterar seu valor e excluí-la a cada repetição.

Galera, as duas afirmações estão certas?

OBS: eu sei que a diferença é insignificante, mas gostaria de entender a teoria do funcionamento da JVM. Nas afirmações foi desconsiderada a existência do Garbage Collector.

Obrigado :thumbup:

Seu exemplo é péssimo - ambos os códigos são quase equivalentes em Java e geram quase exatamente os mesmos bytecodes. E nenhum deles irá estourar a memória. Monte um exemplo melhor. (A única diferença é o que ocorre com a variável a depois de sair do loop, já que ela existe fora do loop no caso 1 e não existe no caso 2.

class TesteLoop {
    public void loop1 () {
        int a = 0;
        for (int e = 0; e < 9999; e++) {
            a = e;
        }
    }
    public void loop2 () {
        for (int e = 0; e < 9999; e++) {
            int a = e;
        }
    }
}

Aqui vai o bytecode gerado. No caso (1) considere que a posição 1 contém a variável “a” e a posição 2 contém a variável “e”. No caso (2) é a mesma coisa. A única diferença é que, no caso (1), a variável a é inicializada com 0, enquanto que no caso (2) a variável a já recebe logo de cara o valor de e.

public void loop1();
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iconst_0
   3:   istore_2

   4:   iload_2
   5:   sipush  9999
   8:   if_icmpge       19
   11:  iload_2
   12:  istore_1
   13:  iinc    2, 1
   16:  goto    4

   19:  return

public void loop2();
  Code:
   0:   iconst_0
   1:   istore_1

   2:   iload_1
   3:   sipush  9999
   6:   if_icmpge       17
   9:   iload_1
   10:  istore_2
   11:  iinc    1, 1
   14:  goto    2

   17:  return