Recebo esta mensagem de erro ao executar meus testes JUnit:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Sei o que OutOfMemoryError
é, mas o que significa o limite de sobrecarga do GC? Como posso resolver isso?
java
garbage-collection
out-of-memory
heap-memory
Mnementh
fonte
fonte
OutOfMemoryError
cenários para os quais aumentar o heap não é uma solução válida: ficar sem threads nativos e sem perm gen (que é separado do heap) são dois exemplos. Tenha cuidado ao fazer declarações excessivamente amplas sobreOutOfMemoryErrors
; há um conjunto inesperadamente diversificado de coisas que podem causar isso.Respostas:
Esta mensagem significa que, por algum motivo, o coletor de lixo está demorando muito tempo (por padrão, 98% de todo o tempo de CPU do processo) e recupera muito pouca memória em cada execução (por padrão, 2% do heap).
Isso significa efetivamente que seu programa para de fazer progresso e está ocupado executando apenas a coleta de lixo o tempo todo.
Para impedir que seu aplicativo absorva o tempo da CPU sem fazer nada, a JVM lança isso
Error
para que você tenha a chance de diagnosticar o problema.Os casos raros em que eu vi isso acontecer é que algum código criava toneladas de objetos temporários e toneladas de objetos com pouca referência em um ambiente já muito restrito à memória.
Confira o guia de ajuste do Java GC, que está disponível para várias versões do Java e contém seções sobre esse problema específico:
fonte
Citando o artigo da Oracle "Ajuste da coleta de lixo da máquina virtual Java SE 6 HotSpot [tm]" :
EDIT: parece que alguém pode digitar mais rápido do que eu :)
fonte
-XX:
início de várias opções de linha de comando é um sinalizador que indica que essa opção é altamente específica da VM e instável (sujeita a alterações sem aviso prévio em versões futuras). De qualquer forma, o-XX:-UseGCOverheadLimit
sinalizador informa à VM para desativar a verificação de limite de sobrecarga do GC (na verdade "desativa"), enquanto o seu-Xmx
comando apenas aumentou o heap. No último caso, a verificação de sobrecarga do GC ainda estava em execução , apenas parece que um monte maior resolveu os problemas de falha do GC no seu caso (isso nem sempre ajuda).Se você tem certeza de que não há vazamentos de memória no seu programa, tente:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.Se necessário, a verificação do limite pode ser desativada adicionando a opção
-XX:-UseGCOverheadLimit
à linha de comandos.fonte
List
objeto dentro do loop fez com que o GC fosse chamado 39 vezes em vez de 22 vezes.Geralmente é o código. Aqui está um exemplo simples:
Usando o Java 1.6.0_24-b07 em um Windows 7 de 32 bits.
Então olha
gc.log
Agora concedido, esse não é o melhor teste ou o melhor design, mas, quando se depara com uma situação em que você não tem escolha a não ser implementar um loop ou ao lidar com código existente que se comporta mal, optar por reutilizar objetos em vez de criar novos pode reduzir o número de vezes que o coletor de lixo atrapalha ...
fonte
gc.log
arquivo. Meus testes mostram muito menos vezes no geral, mas o menor número de "Disparadores" é MELHOR e, agora, o MAU é "mais ruim" do que o pior agora. Minhas contagens: MAU: 26, MAIOR: 22, MAIOR. #: #List<Double> list
na espira externa , em vez de antes da espira externa, e accionado 39 colecções de lixo.Causa do erro de acordo com o Guia de solução de problemas da plataforma Java [8], Standard Edition : (ênfase e quebras de linha adicionadas)
Além de definir a memória heap com -
Xms1g -Xmx2g
, tenteDê uma olhada em algumas perguntas relacionadas ao G1GC
Coleta de lixo e documentação do Java 7 (JDK 7) no G1
Coleta de Lixo Java G1 em Produção
Artigo Oracle technetwork para ajuste fino de GC
fonte
Apenas aumente um pouco o tamanho da pilha configurando esta opção em
Executar → Executar Configurações → Argumentos → Argumentos da VM
Xms - para limite mínimo
Xmx - para limite máximo
fonte
arguments
guia ... o que devemos fazer para conseguir isso?Para mim, as seguintes etapas funcionaram:
eclipse.ini
arquivomudança
para
Reinicie o Eclipse
Veja aqui
fonte
tente isso
abra o
build.gradle
arquivofonte
O seguinte funcionou para mim. Basta adicionar o seguinte trecho:
fonte
aumente javaMaxHeapsize no seu arquivo build.gradle (Module: app)
para (Adicione esta linha em gradle)
fonte
Descrições de tamanho de heap Java (xms, xmx, xmn)
Define o tamanho inicial do heap Java. O tamanho padrão é 2097152 (2 MB). Os valores devem ser múltiplos e maiores que 1024 bytes (1 KB). (O sinalizador -server aumenta o tamanho padrão para 32M.)
Define o tamanho inicial do heap Java para a geração Eden. O valor padrão é 640K. (O sinalizador -server aumenta o tamanho padrão para 2M.)
Define o tamanho máximo para o qual o heap Java pode crescer. O tamanho padrão é 64M. (O sinalizador -server aumenta o tamanho padrão para 128M.) O limite máximo de heap é de cerca de 2 GB (2048MB).
Formatação de argumentos de memória Java (xms, xmx, xmn)
Ao definir o tamanho do heap Java, especifique seu argumento de memória usando uma das letras "m" ou "M" para MB ou "g" ou "G" para GB. Sua configuração não funcionará se você especificar "MB" ou "GB". Argumentos válidos têm esta aparência:
-Xms64m ou -Xms64M -Xmx1g ou -Xmx1G Também pode usar 2048MB para especificar 2GB Além disso, certifique-se de usar apenas números inteiros ao especificar seus argumentos. Usar -Xmx512m é uma opção válida, mas -Xmx0.5g causará um erro.
Esta referência pode ser útil para alguém.
fonte
Você também pode aumentar a alocação de memória e o tamanho da pilha adicionando isso ao seu
gradle.properties
arquivo:org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Não precisa ser 2048M e 32g, faça o tamanho que você quiser.
fonte
Resolvido:
Basta adicionar
org.gradle.jvmargs=-Xmx1024m
em
gradle.properties
e se ele não existir, criá-la.
fonte
Estou trabalhando no Android Studio e encontrei esse erro ao tentar gerar um APK assinado para lançamento. Consegui criar e testar um APK de depuração sem problemas, mas assim que quisesse criar um APK de lançamento, o processo de compilação seria executado por minutos a fio e, finalmente, terminaria com o "Erro java.lang.OutOfMemoryError: GC limite superior excedido ". Aumentei os tamanhos de heap para o VM e o compilador Android DEX, mas o problema persistiu. Finalmente, depois de muitas horas e canecas de café, constatou-se que o problema estava no arquivo 'build.gradle' no nível do aplicativo - eu tinha o parâmetro 'minifyEnabled' para o tipo de compilação do release definido como 'false', consequentemente executando os itens Proguard no código que não passou pelo processo de redução de código '(consulte https://developer.android.) Alterei o parâmetro 'minifyEnabled' para 'true' e a compilação do release foi executada como um sonho :)
Em resumo, tive que alterar meu arquivo 'build.gradle' no nível do aplicativo de: // ...
para
fonte
Para aumentar o tamanho da pilha no IntelliJ IDEA, siga as seguintes instruções. Funcionou para mim.
Para usuários do Windows,
Vá para o local em que o IDE está instalado e procure o seguinte.
Edite o arquivo e adicione o seguinte.
É isso !!
fonte
você pode tentar fazer alterações na configuração do servidor consultando esta imagem e aumentando o tamanho da memória para processar as alterações do processo destacadas em amarelo
você também pode fazer alterações no heap java abrindo cmd->
set _java_opts -Xmx2g
2g (2gigabytes), dependendo da complexidade do seu programa
tente usar variáveis e variáveis temporárias menos constantes
fonte
Você precisa aumentar o tamanho da memória no Jdeveloper, vá para setDomainEnv.cmd .
e
fonte
No Netbeans, pode ser útil criar um tamanho máximo de heap. Vá para Executar => Definir configuração do projeto => Personalizar . Na janela Executar da sua janela exibida, vá para VM Option , preencha
-Xms2048m -Xmx2048m
. Pode resolver o problema do tamanho da pilha.fonte
A reinicialização do meu MacBook corrigiu esse problema para mim.
fonte
Não sei se isso ainda é relevante ou não, mas quero apenas compartilhar o que funcionou para mim.
Atualize a versão do kotlin para a versão mais recente disponível. https://blog.jetbrains.com/kotlin/category/releases/
e está feito.
fonte