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?