Métricas, rastreamentos, logs — e agora, dados de perfil do OpenTelemetry
31 de maio de 2024Por que as ações HTML se tornaram repentinamente uma tendência do JavaScript
31 de maio de 2024A plataforma Java tem quase 30 anos, mas mantém consistentemente sua posição entre as três linguagens de programação mais populares. Uma das principais razões para isso é a Java Virtual Machine (JVM). Ao abstrair preocupações como gerenciamento de memória e compilação de código durante a execução, a JVM pode oferecer escalabilidade no nível da Internet além do alcance de outros tempos de execução.
O que também ajuda a manter o Java tão popular é o ritmo de evolução da linguagem, das bibliotecas e da JVM. Em 2019, OpenJDK, o projeto de código aberto para desenvolvimento Java, mudou para um cronograma de lançamento baseado em tempo, em vez de baseado em recursos. Agora temos duas novas versões do Java a cada ano, em vez de ter que esperar entre dois e quatro anos.
Com tantos lançamentos, não é prático que as distribuições ofereçam manutenção e suporte estendidos para todas as versões. Apenas os específicos classificados como suporte de longo prazo (LTS) incluem isso por um padrão de oito anos a partir do lançamento. (JDK 8 é suportado até dezembro de 2030, JDK 11 é suportado até janeiro de 2032 e JDK 6 e 7 são suportados apenas pela Azul até dezembro de 2027). Todas as versões são adequadas para uso em produção, mas a maioria dos usuários corporativos optará apenas por implantar aplicativos usando um JDK LTS.
Como funcionam os threads em Java
A versão LTS atual é o JDK 22, lançado em março de 2024. O JDK 21, lançado em setembro de 2023, incluiu alguns novos recursos interessantes que o tornarão atraente para aplicativos que suportam um grande número de usuários simultâneos.
Desde o início, Java foi uma linguagem que apoiava a ideia de execução simultânea de tarefas. Diferentemente de linguagens como C e C++, que contam com bibliotecas externas para esse suporte, Java possui o conceito de threads embutido na linguagem.
Suponha que você esteja desenvolvendo um aplicativo baseado na Web que suportará muitos usuários simultâneos. Nesse caso, a conexão de cada usuário pode ser tratada simultaneamente, alocando seu próprio thread ou threads para processar as transações necessárias. Tudo isso é feito de forma independente, mantendo os dados de cada usuário isolados dos demais. Isso é conhecido como modelo de programação thread-per-request (TPR).
Embora seja excelente para os desenvolvedores desses tipos de aplicativos, ele apresenta algumas limitações. O Linux, por exemplo, é um sistema operacional (SO) extremamente popular que pode lidar com todos os aspectos de baixo nível dos threads e atribuí-los às CPUs e núcleos disponíveis do hardware em uso. Antes do JDK 21, todos os threads Java eram mapeados diretamente para threads do sistema operacional, portanto a JVM não precisava lidar com os aspectos de baixo nível.
A desvantagem é a escalabilidade ao lidar com centenas de milhares (ou mais) de conexões simultâneas. Os requisitos de memória ao usar tantos threads tornam impraticável o provisionamento de hardware de servidor econômico, seja no local ou na nuvem.
Se você observar como funciona a maioria dos aplicativos TPR, descobrirá que grande parte do processamento envolve chamadas para outras partes do sistema, sejam bancos de dados, arquivos ou conexões de rede para outros serviços. Essas conexões exigem que o thread espere (ou bloqueie) até que o banco de dados, por exemplo, responda. A realidade é que o thread passa a maior parte do tempo esperando, portanto não está usando ativamente o thread do sistema operacional ao qual foi alocado.
Apresentando Threads Virtuais para Aumentar a Escalabilidade
O JDK 21 introduziu o recurso Virtual Thread. Em vez de usar um mapeamento um-para-um entre threads Java e OS, agora podemos ter um mapeamento muitos-para-um. Vários threads Java compartilham um único thread de sistema operacional.
Para os desenvolvedores, a migração para threads virtuais é muito simples, exigindo apenas uma mudança na forma como o thread é criado, e não como ele é usado. Quando o aplicativo é executado, a JVM assume a responsabilidade de alternar entre os threads virtuais que compartilham um thread do sistema operacional (agora chamado de plataforma).
Quando um thread Java faz uma chamada que irá bloqueá-lo, a JVM registrará todos os detalhes do estado do thread e mudará o thread da plataforma para um thread Java diferente que tenha trabalho a fazer. Os requisitos de memória de um thread virtual são aproximadamente mil vezes menores que os de um thread de plataforma por padrão, portanto, a escalabilidade pode ser aumentada enormemente sem adição de hardware.
Ao considerar threads virtuais, é vital compreender a diferença entre escalabilidade e desempenho. Por exemplo, a escalabilidade de uma aplicação de comércio eletrônico determina quantos usuários podem acessá-la ao mesmo tempo. O desempenho desse aplicativo determina a rapidez com que o sistema responde a cada solicitação. Threads virtuais aumentarão potencialmente a escalabilidade de um aplicativo, permitindo que mais conexões sejam tratadas simultaneamente.
O que isso não fará é melhorar o desempenho para entregar os resultados a essas conexões mais rapidamente. Também deve-se tomar cuidado sobre como um aplicativo processa cada conexão. Se essa conexão exigir tarefas que exigem uso intensivo de CPU, em vez de tarefas que passam a maior parte do tempo esperando, você poderá facilmente acabar com pior escalabilidade e o tempo limite das conexões se esgotará porque elas não poderão acessar o thread da plataforma compartilhada.
Uma solução para melhor desempenho Java
Para oferecer melhor escalabilidade e desempenho para seus aplicativos, você deve considerar uma JVM com desempenho otimizado. Ao substituir certos componentes internos, como gerenciamento de memória, coleta de lixo e compilação just-in-time, é possível obter latência reduzida e rendimento melhorado. O Zing JVM da Azul oferece o coletor de lixo C4, o compilador Falcon JIT e a tecnologia de eliminação de aquecimento ReadyNow.
De acordo com o Gartner, você tem opções para escolher. Certifique-se de escolher uma JVM que esteja totalmente em conformidade com a especificação Java SE e passe em todo o Kit de Compatibilidade de Tecnologia (TCK) necessário. Azul oferece uma opção que não exige reescrever ou mesmo recompilar nenhum código.
Com o JDK 21, você tem opções de como aproveitar as vantagens dos threads virtuais para aumentar a escalabilidade, mas é melhor combinar isso com uma JVM que oferece melhorias de desempenho para seus aplicativos Java.
O post Como os threads virtuais do Java ajudam sua empresa? apareceu primeiro em The New Stack.