O que faz -XX: MaxPermSize?

260

Especificamente, por que ajudaria a corrigir um problema de PermGen OutOfMemoryError?

Além disso, pontos de bônus para uma resposta que me indica a documentação sobre argumentos da JVM ...

Geoff
fonte
6
oracle.com/technetwork/java/javase/tech/… Como você me dará esses pontos de bônus agora? :)
Denys Séguret
1
@PaulTomblin Não sei se o sujeito ao qual você está vinculando o artigo (o primeiro resultado do Google) tem alguma ideia do que está falando.
Denys Séguret
@dystroy eu poderia te enviar um cookie? Ou você pode apenas tomar satisfação em uma pergunta bem respondeu;)
Geoff
5
Isso não responder à pergunta especificamente, mas se você está olhando para o gerenciamento de memória JVM, os melhores artigos que li sobre ele são este e este link de InfoQ
Abe

Respostas:

274

O espaço permanente é onde as classes, métodos, seqüências de caracteres internalizadas e objetos semelhantes usados ​​pela VM são armazenados e nunca desalocados (daí o nome).

Este artigo da Oracle apresenta sucintamente o funcionamento e a parametrização do HotSpot GC e aconselha você a aumentar esse espaço se você carregar muitas classes (normalmente é o caso de servidores de aplicativos e alguns IDE como o Eclipse):

A geração permanente não tem um impacto perceptível no desempenho do coletor de lixo para a maioria dos aplicativos. No entanto, alguns aplicativos geram e carregam dinamicamente muitas classes; por exemplo, algumas implementações de páginas JavaServer Pages (JSP). Esses aplicativos podem precisar de uma geração permanente maior para armazenar as classes adicionais. Nesse caso, o tamanho máximo de geração permanente pode ser aumentado com a opção de linha de comando -XX: MaxPermSize =.

Observe que esta outra documentação da Oracle lista os outros argumentos do HotSpot.

Atualização: A partir do Java 8, o espaço permgen e essa configuração se foram. 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 mais ver esse erro.

Denys Séguret
fonte
93

-XX:PermSize -XX:MaxPermSize são usados ​​para definir o tamanho da geração permanente.

Geração permanente: a geração permanente é onde os arquivos de classe são mantidos. Estes são o resultado de classes compiladas e páginas JSP. Se esse espaço estiver cheio, ele dispara uma coleta de lixo completa. Se a Coleta de Lixo Completa não puder limpar as classes antigas não referenciadas e não houver espaço para expandir o Espaço Permanente, um erro de Falta de Memória (OOME) será lançado e a JVM falhará.

stones333
fonte
48

No Java 8, esse parâmetro é comumente usado para imprimir uma mensagem de aviso como esta:

Aviso da VM do servidor Java HotSpot (TM) de 64 bits: ignorando a opção MaxPermSize = 512m; suporte foi removido no 8.0

A razão pela qual você recebe essa mensagem no Java 8 é porque o Permgen foi substituído pelo Metaspace para solucionar algumas das desvantagens da PermGen (como você pôde ver por si mesmo, uma dessas desvantagens é que ela tinha um tamanho fixo).

FYI: um artigo no Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBourgeois
fonte
6
Consulte também: Eliminação do PermGen no JDK 8 (stackoverflow).
será