O Que Faz-XX:MaxPermSize?
4 answers
O espaço permanente é onde as classes, métodos, strings internalizados, e objetos semelhantes usados pela VM são armazenados e nunca desallocados (daí o nome).
Este artigo do Oracle apresenta sucintamente o funcionamento e a parametrização do HotSpot GC e aconselha-o a aumentar este espaço se carregar muitas classes (este é tipicamente o caso dos servidores de aplicações e alguns IDE como o Eclipse):
A geração permanente não tem um perceptível impacto no lixo desempenho do coletor para a maioria das aplicações. No entanto, alguns aplicações geram e carregam dinamicamente muitas classes; por exemplo, algumas implementações de páginas JavaServer (JSP). As as aplicações podem necessitar de uma geração permanente maior para manter o aulas adicionais. Em caso afirmativo, o tamanho máximo de geração permanente pode ser aumentada com a opção da linha de comando-XX: MaxPermSize=.
Note que Esta outra documentação Oracle lista a outra Argumentos do HotSpot.
Update: a começar pelo Java 8, tanto o espaço permgen como esta configuração desapareceram. O modelo de memória usado para classes e métodos carregados é diferente e não é limitado (com configurações padrão). Você não deve ver mais este erro.
-XX:PermSize -XX:MaxPermSize
são usados para definir o tamanho para geração permanente.
Geração permanente: a geração permanente é onde os ficheiros de classe são guardados. Estes são o resultado de classes compiladas e páginas JSP. Se este espaço estiver cheio, despoleta uma colecção de lixo. Se a coleção completa de lixo não puder limpar as antigas classes não referenciadas e não houver espaço para expandir o espaço permanente, um erro de memória (OOME) é jogado e o JVM vai cair.
Em Java 8 esse parâmetro é comumente usado para imprimir uma mensagem de aviso como esta:
Java HotSpot(TM) 64-Bit Server VM aviso: a ignorar a opção MaxPermSize = 512m; o suporte foi removido em 8, 0
A razão pela qual você recebe esta mensagem em Java 8 é porque o Permgen foi substituído por Metaspace para resolver alguns dos inconvenientes do PermGen (como você foi capaz de ver por si mesmo, um desses inconvenientes é que ele tinha um tamanho fixo).
Para que saibas: um artigo sobre Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html
O MaxPermSize é o tamanho máximo para o heap de geração permanente, um heap que contém o código de bytes das classes e é mantido separado do heap objeto contendo as instâncias reais.