Metaespaço Java8 e uso de heap

Eu tenho esse código para gerar classe dinamicamente e carregá-lo

import javassist.CannotCompileException;
import javassist.ClassPool;

public class PermGenLeak {
    private static final String PACKAGE_NAME = "com.jigarjoshi.permgenleak.";

    public static void main(String[] args) throws CannotCompileException, InterruptedException {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            ClassPool pool = ClassPool.getDefault();
            pool.makeClass(PACKAGE_NAME + i).toClass();
            Thread.sleep(3);
        }

    }
}

Lancei essa classe contra o Java 7 (jdk1.7.0_60) e, como esperado, ele preencheu PermGenSpace e o heap permaneceu sem uso A imagem mostra o uso de permgen horas extras e, no final, a JVM foi encerrada

Agora, o mesmo código foi executado no Java 8 (jdk1.8.0_40-ea) e, como esperado, continuou expandindo a memória nativa (Metaspace), mas surpreendentemente para 1g de Metaspace, ele consumiu 3g de Heap no OldGen (quase 3x de Metaspace mantido ao longo do tempo)

imagem mostra horas extras de uso do Metaspace e amostra de uso de memória do Sistema

este e-mail de Jon Masamitsu eesse ingresso do JEP diz

internadoString e estatísticas de classe e alguns dados diversos foram movidos para Heap

o que exatamente faz esse aumento no heap à medida que carrega mais classes no Metaspace?

questionAnswers(2)

yourAnswerToTheQuestion