PermGenが枯渇する前にかならずFullGCが起きるとは限らない

クラスローダリークのテストを走らせていたらOutOfMemoryError/PermGen spaceが出たので、リークだ、嫌だなあと思ったんだけど、ヒープダンプを見てみると、ルートにたどり着けないインスタンスがたくさんあった。試しにループの合間にSystem.gc()を挟んでみたら、OutOfMemoryErrorが起きなくなった。

つまり、PermGenが枯渇する前に、かならずFullGCが起きるとは限らない。ClassLoader#defineClassが呼ばれた時にPermGenがいっぱいいっぱいだと、Full GCされずに死んでしまうことがあり得る。