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.