Javaにおけるメモリ確保についてなのですが

プログラム内で宣言されている変数や配列、オブジェクトは、
プログラム実行時に必要十分なだけメモリに確保されるのでしょうか?
ちょっと苦しいのですが次のようなプログラムがあるとします

public static void main(String args[]){
int lpArr[];
lpArr = new int[128]; //1
lpArr = new int[128]; //2

return;
}

この時//2の行を実行された場合、//1で実行された時に得られたメモリが参照できなくなると同時に
新たな領域へ参照できる事を意味します。

この場合//1で割り当てられたメモリは//2を実行時にシステムから解放されるのでしょうか?
それともプログラム終了時に解放されるのでしょうか?
すみません