Definitely use glTexSubImage2D. Smart drivers might be able to reuse the same texture memory when making a new image, but who knows? Also, glTexSubImage2D can be used to transfer only the parts of the BufferedImage that have changed, if you have an easy way of tracking that.
I can quite easily figure out what parts changed so that is an option instead of splitting the overlay up into several textures.
I would also recommend not updating the texture when the window overlay moves. If you think of all the components placed with respect to the corner of the overlay, then they aren't moving so you don't need to change how they are drawn.
Well, I have lots of windows rendered to the overlay and they can be dragged around by the user so I can't make them static with respect to the corner of the overlay.
I'll look into creating several textures instead of one huge one with lots of transparent pixels, update it with glTexSubImage2D and see what happens with the performance