JLabel.setText()
calls repaint, which pushes a PaintEvent
onto the event queue. Because your loop is stalling the event queue, it grows infinitely. Hence the memory leak.
(SwingUtilities.invokeLater()
runs a Runnable on the EDT. If that runnable never returns, like yours here, then no further events can be processed)