BT

Java 9 terá ajustes de limite de memória em containers Docker

| por Abraham Marín Pérez , traduzido por Diogo Carleto em 20 mar 2017. Tempo estimado de leitura: 2 minutos |

Uma mudança experimental foi adicionada ao Java 9, de maneira que a JVM consiga perceber que está executando dentro de um container e ajuste os limites de memória de acordo. Apesar do aumento da popularidade dos containers nos últimos anos, muitas ferramentas, incluindo a JVM, ainda dependem dos parâmetros do host para avaliar os recursos disponíveis, muitas vezes ficando sem memória com mensagens de erro desconcertantes. Essa mudança, que pode estar disponível para o público assim que o Java 9 for lançado, tenta prevenir vários destes cenários.

Tecnologias Container como Docker, Heroku ou Kubernetes, entre outros, são uma forma de máquinas virtuais leves baseadas no sistema operacional Linux. Dessa forma podem fornecer uma funcionalidade muito parecida às máquinas virtuais mais rápidas e consumindo menos recursos, porém existem algumas desvantagens: Enquanto as máquinas virtuais completas simulam uma pilha inteira de hardware dedicado, o que significa que o software existente funciona principalmente como esperado, as tecnologias de containers usam o hardware e o sistema operacional do host, o que significa que o software que se baseia em informações do host pode ignorar as restrições extras que os containers impõem. Fabio Kung, desenvolvedor do serviço de containers Linux na Netflix (também conhecido como Titus), escreveu um bom artigo explicando estes efeitos em 2014, embora o artigo possa estar desatualizado hoje, ainda é uma boa introdução ao tópico.

A JVM não é estranha a isso. Se o limite máximo da memória é definido com -Xmx, a JVM irá configura-lo como uma fração da memória física (tipicamente ¼, mas pode variar), isso pode não levar em conta os limites impostos pelo container. A mudança proposta tenta prevenir este problema checando se a JVM está executando dentro de um Control Group ou cgroup, uma tecnologia Linux como a maioria das tecnologias de container usadas para impor limites no uso de hardware e outros recursos. Se a JVM detecta que está dentro de um cgroup, ela tentará encontrar o limite de memória definido no container e considerará este limite como a memória física disponível. Como ainda é experimental somente será aplicado se ativado com a opção -XX:+UseCGroupMemoryLimitForHeap.

Incorporada no Kernel do Linux em 2008 e redesenhada em 2013, o cgroups isola o uso de recursos e permite que aplicações controlem o acesso à memória. CPU, IO e rede, além de outros. Diferentes aplicações podem criar sua própria hierarquia de cgroups com limites diferentes por grupos, o que significa que uma aplicação não conhece, a priori, o grupo que a mesma irá executar. É por isso que a JVM só pode fazer uma suposição sobre cgroups e o limite de memória.

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Faça seu login para melhorar sua experiência com o InfoQ e ter acesso a funcionalidades exclusivas


Esqueci minha senha

Follow

Siga seus tópicos e editores favoritos

Acompanhe e seja notificados sobre as mais importantes novidades do mundo do desenvolvimento de software.

Like

Mais interação, mais personalização

Crie seu próprio feed de novidades escolhendo os tópicos e pessoas que você gostaria de acompanhar.

Notifications

Fique por dentro das novidades!

Configure as notificações e acompanhe as novidades relacionada a tópicos, conteúdos e pessoas de seu interesse

BT