Ready for this? I'm using a slightly modified version of your stuff Tomb (thank you, thank you).
I say an "InputStream" because first I open an InputStream for the file, and then call the OggInputStream(InputStream) constructor.
I'm really wondering if Java just feels like it doesn't need to clean things up, since when I run a System.gc(), it DOES clean it up but causes the game to pause for a moment while it does so. I've tried rewriting the release() method so as to clean up every buffer and variable that the oggplayer class calls, but it still doesn't clear up the memory with the System.gc() call.
Basically, this is what I see... The game starts at using about 58mb of memory. When the background music begins, that usage starts climbing (we're talking about kbytes, not mb). It continues climbing until the music stops (at this point the memory usage is about the 58mb + the size of the ogg file). Then, when the music starts again (because it's looped), the memory starts climbing again.
I've tracked the memory through about 4 music loops. It's never cleared out between loops (and I'm being very good to call the release() function before each restart), it just keeps going up. Of course, the machine I'm on has plenty of memory to spare, so could it just be the JVM being smart?
BTW, I had to stop using the playinthread() method after the last release of lwjgl... For some reason, it would crash when calling release() or stop() (it looks like the thead continues polling update() even though the buffers have been destroyed). Could calling the update() function manually in my game loop be causing this?