Pergunta

Eu tenho um loop que gera um monte de threads. Estes tópicos contém, entre outras coisas, 2 (em massa) StringBuilder objetos. Estes tópicos em seguida, executar e fazer a sua coisa.

No entanto, notei que depois de uma certa quantidade de tópicos, recebo acidentes estranhos. Eu sei que isso é por causa destes StringBuilder, porque quando eu reduzir a sua capacidade inicial, posso começar muito mais threads. Agora para essas StringBuilders, eles são criar como esta no construtor do objeto fio:

StringBuilder a = new StringBuilder (30000);
StringBuilder b = new StringBuilder (30000);

O ponto em que geralmente cai é de cerca de 550 tópicos, o que resulta em um pouco mais de 62MB. Combinado com o resto do programa a memória em uso é mais provável 64MB, o que eu li em algum lugar on-line foi o tamanho defaulf da piscina alocação de memória JVM. Eu não sei se isso é verdade ou não.

Agora, há algo que eu estou fazendo errado, que de alguma forma por causa do projeto, estou alocação de memória de forma errada? Ou este é o único caminho e devo dizer a JVM para aumentar seu pool de memória? Ou algo totalmente diferente?

Além disso, por favor, não me diga para definir uma capacidade inferior, eu sei que estes StringBuilders automaticamente aumentar a sua capacidade quando necessário, mas eu gostaria de ter uma solução para este problema.

Foi útil?

Outras dicas

Se você está armazenando uma grande quantidade de informações em um StringBuilder, você vai voltar referência a ele em algum momento? Se não, então apenas escrevê-lo para outro suporte (DB, arquivo etc). O programa tem uma quantidade finita de recursos, não pode segurar todo o estado de um sistema inteiro de uma vez. -Xmx lhe dará mais espaço para armazenamento na memória, no entanto, não vai fazer a sua infinita capacidade de armazenamento.

Considere usar um ThreadPoolExecutor, e definir o tamanho do conjunto para o número de CPUs em sua máquina. Criar mais tópicos do que CPUs é apenas adicionando sobrecarga.

ExecutorService service = Executors.newFixedThreadPool(cpuCount))

Além disso, você pode reduzir o uso de memória, escrevendo suas cordas para arquivos em vez de mantê-los na memória com StringBuilders.

Suponha 1MB por thread. Esse é o custo RAM de criação de cada um, para além da memória alocada pelo seu processo.

Como Gregory disse, dar a JVM, algumas opções como -Xmx.

Considere também usando um ThreadPool ou Executor para garantir que apenas uma determinada quantidade de segmentos estão executando simultaneamente. Dessa forma, a quantidade de memória pode ser mantido limitado sem desaceleração (como seu processador não é capaz de executar 550 threads ao mesmo tempo de qualquer maneira).

E quando você estiver usando um Executor não criam os StringBuilders no construtor, mas no método de execução.

Você pode usar um FileWriter ao texto saída para um arquivo, em seguida, puxe-o novamente com um FileReader. Dessa forma, você só precisa armazenar o nome do arquivo na memória, em vez de todo o conteúdo da string.

Para reduzir o tempo de tópicos que você pode usar um ExecutorService, ou simplesmente usar alguns tópicos que lêem fora de uma fila.

Meu palpite é que com um pouco de mexer provavelmente você pode obter o seu programa para baixo para não precisar de muita memória em tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top