I have finally found a workaround, using the standard OpenJDK that comes with Centos 5: java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5. Using this JDK fixes the leak completely. VIRT size stabilizes at 1833M, which is exactly what I would expect. So I have no idea if this version of OpenJDK contains a fix, or the newer commercial JDKs from Sun contain a regression - as I still see the problem with JDK 6 update 19.
The crazy part is that no one else seems to have had such a problem. My application is rather busy - up to 50 transactions/second, but it still confounds that no one else seems to see this native leak. Anyway, thanks for your replies. I would still like to figure out what is going on, but for now, I will just be happy I have found a way to stabilize my cluster.