Estou muito familiarizado com o conceito de pool de objetos e sempre tento usá-lo o máximo possível.
Além disso, sempre achei que o pool de objetos é a norma padrão, como observei que o próprio Java e as outras estruturas usam o pool o máximo possível.
Recentemente, embora eu tenha lido algo completamente novo (e contra-intuitivo?) Para mim.
Esse pool realmente piora o desempenho do programa, especialmente em aplicativos simultâneos, e é aconselhável instanciar new
objetos, pois nas JVMs mais recentes, a instanciação de um objeto é realmente rápida.
Eu li isso no livro: Java Concurrency in Practice
Agora estou começando a pensar se estou entendendo algo errado desde a primeira parte do livro, aconselhada a usar Executors
essas reutilizações em Thread
vez de criar novas instâncias.
Então, o pool de objetos ficou obsoleto hoje em dia?
fonte
A resposta para a pergunta concreta: 'O pool de objetos é uma técnica obsoleta?' é:
Não. O pool de objetos é amplamente usado em locais específicos - pool de threads, pool de conexão de banco de dados etc.
A criação geral de objetos nunca foi um processo lento. O pool em si consome recursos - memória e poder de processamento. Qualquer otimização é uma troca.
A regra é:
Otimização prematura é má !!!
Mas quando uma otimização é prematura?
Otimização prematura é qualquer otimização feita antes de você descobrir um gargalo por meio de criação de perfil completo .
fonte
Nas situações em que você deseja evitar a coleta de lixo completamente, acho que o pool de objetos é a única alternativa viável. Portanto, não, absolutamente não é uma técnica obsoleta.
fonte
A medida
Depende completamente do seu caso de uso, tamanho de seus objetos, sua JVM, suas opções de JVM, qual GC você ativou e vários outros fatores.
Resumindo: meça antes e depois. Supondo que você esteja usando uma estrutura de pool de objetos (como no Apache), não deve ser muito doloroso alternar entre implementações.
Dica de teste de desempenho extra - deixe a JVM esquentar um pouco primeiro, execute os testes em uma JVM em execução várias vezes, pois ela pode se comportar de maneira diferente.
fonte
Depende do contexto.
fonte
Não sei se há uma tendência de mudança aqui, mas certamente será o caso de que depende . Se sua classe Java estiver gerenciando um recurso externo, como uma conexão RMI ou carregando um arquivo de recurso, etc. - certamente os custos de instanciação de objetos ainda poderão ser altos (embora esses recursos já possam estar reunidos para você!). Como prática geral, eu concordo com o livro.
fonte