Eduardo Mello Cantú Resumo: The Multi-Tasking Virtual Machine: Building a Highly Scalable JVM UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA Florianópolis – SC 2008.1 1 Introdução Algumas tarefas de programação relacionadas a programação do sistema não podem ser executadas separadamente usando as bibliotecas padrão Java. Desenvolvedores talvez tenham que usar código nativo, linguagens de script, C ou C++ antes de retornar ao código Java. Por exemplo, afirmando que uma dada computação Java deve ter acesso exlusivo a pelo menos 50% do processador da máquina que a hospeda, ou que seu uso de rede seja limitado a 5 MBs, não podem ser expressados nas interfaces atuais. E hoje, quando um usuário executa múltiplas aplicações Java concorrentes em diferentes instâncias da máquina virtula Java ( JVM), a tendência é de duplicação do esforço em cada máquina virtual. Por exemplo, quando múltiplas aplicações são executadas concorrentemente, cada uma tem que carregar, transformar, verificar e criar a representação de todas as classes da aplicação, até mesmo as mais comuns, como java.lang.Object. O tempo de inicialização da aplicação, da memória necessária, e da execução impactam negativamente na aplicação. Desenvolvedores que tentam contornar o problema usando classloaders ( carregadores de classes) logo descobrem que eles provêm isolação inadequada entre aplicações, tornando difícil a finalização das aplicações. O time de pesquisa do projeto Barcelona dos laboratórios da Sun Microsystems, liderados pelo Dr. rzegorz Czajkowski, está corrigindo esses problemas desenvolvendo técnicas que permitem alocar múltiplas aplicações em uma única instância da máquina virtual. As aplicações são isoladas umas das outras e cada um "pensa" que possui a máquina virtual só para ela. Compartilhamento transparente de metadados, como o bytecode de métodos, reduz os tempos de alocação e memória e inicialização. Além disso, através da contrução da fundação de uma computação Java isolada, o time desenvolveu um conjunto de técnicas de gerenciamento de recursos e APIs que permitem o desenvolvedor definir novos tipos de recursos, particionar recursos entre as computações, e controle de gerenciamento de recursos. 2 A máquina virtual multi-tarefas As extensões e modificações propostas para a máquina virtual foram prototipadas como Máquina virtual multi-tarefa ( do inglês, Multi-Tasking Virtual Machine ou MVM). Bytecodes Java existentes podem rodar imutáveis, aproveitando os recursos da escalabilidade. Novas aplicações podem tirar proveito de novas abstrações e interfaces, que atualmente não fazem parte da plataforma Java, para cumprir uma variedade de tarefas de programação dos sistemas. "Através de todas as métricas da escalabilidade, queremos melhorar o bem estar dos programas Java", afirma Czajkowski. "Estamos escalonando a plataforma Java e a tornando um ambiente operacional completo, adicionando inúmeras APIs e extensões para que tudo o que você precisa, relacionado ao domínio de programação de sistemas, possa ser feito pela própria linguagem." O MVM é uma máquina virtual de propósito geral para executar múltiplas aplicações escritas na linguagem Java, baseadas na máquina virtual Java HotSpot Virtual Machine e se compilador. Através da hospedagem de múltiplas tarefas, o MVM aumenta a escalabilidade da plataforma Java. "Adentramos a execução da máquina virtual Java e fizemos a mesma pergunta para cada componente", explica Czajkowski, "Isto pode ser compartilhado? Se pode, então será. Senão, o replicamos ou modificamos algo para que se torne altamente compartilhável." O MVM alcança uma boa escalabiliade através de uma agresiva aplicação de seu principal princípio: o tanto de compartilhamento transparente de sua execução quanto possível entre as aplicações e apenas a replicação do sistema em execução que depende de um estado da aplicação. Todas as APIs e mecanismos conhecidos da linguagem de programação Java são disponibilizados para as aplicações. O resultado final é que ninguém pode dizer se uma aplicaçõa está rodando em um MVM ou em uma máquina virtual só dela. Enquanto o protótipo orginal do MVM focava no ambiente Solaris/SPARC, seus criadores não veêm grandes problemas em portá-lo para outras plataformas. MVM também é um passo além para prover um ambiente completo de operações para programas Java, através de um conjunto de APIs cuidadosamente desenvolvidas para gerenciamento de recursos, serviços e agrupamentos ( clustering). 3 A API isolada Computações isoladas, ou isoladas do Java são a chave para a programação MVM. Uma isolada é uma aplicação Java que não compartilha objetos entre outras isoladas. A especificação da Application Isolation API, JSR 121 no Java Community Process, permite a criação e detruição dinâmica das isoladas. 4 O ganho de performance com o MVM O MVM oferece um ganho de performance substâncial. Quando comparado a máquina virtual HotSpot, da qual deriva, o MVM reduz o tempo de inicialização entre 60% e 90%, uma espera de três segundos por uma aplicação gráfica ( GUI) é reduzido para um segundo. O ganho de performance é dado por dois motivos. Primeiro, porque o MVM compartilha a representação da execução de classes entre aplicações, quando uma aplicação carrega uma classe, outra pode usá-la sem ler o arquivo, transformar e verificar. Segundo, com vários componentes Java trabalhando no mesmo processo, a troca de processos é evitada quando eles se comunicam. 5 Falso começo em compartilhamento de processos Antes de completar o MVM, o time do projeto Barcelona testou duas alternativas que permitiam processos de JVM separadas compartilhar dados. Em ambos modelos, cada aplicação executava em sua própria máquina virtual ( JVM) em seu próprio processo do sistema operacional, enquanto compartilhava código com outras JVMs. 6 Transferindo o MVM para a plataforma Java 2, Micro Edition ( J2ME) O time do projeto Barcelona tem colaborado com um grupo da Sun para contruir uma máquina virtual para telefones celulares em uma tentativa disponibilizar o MVM para o CLDC ( Connected Limited Device Configuration). 7 Aplicando o MVM na plataforma Java 2, Enterprise Edition ( J2EE) A plataforma Java 2, Enterprise Edition ( J2EE) é similar a um sistema operacional no qual um servidor J2EE pode hospedar diversas aplicações. Na prática, isso é raramente feito devido a limitações na escalabilidade, fraco isolamento entre aplicações e facilidades de gerencimento de recursos inadequados na plataforma Java. Isso leva a proliferação de instâncias de servidores, cada um hospedando uma única aplicação, ocasionando em um aumento dramático da memória necessária e uma administração complexa do sistema. O MVM suporta múltiplas instâncias do J2EE 1.3.1 Reference Implementation através de uma eficiente implementação de "isoladas", assim aumentando substâncialmente a escalabilidade, reduzindo a memória necessária e o tempo de inicialização do servidor. 8 A interface do gerenciamento de recursos Enquanto um servidor J2EE suporta múltiplas aplicações, níveis de performance podem se tornar difíceis de controlar devido a ausência de facilidades para gerenciamento de recursos na plataforma Java. O time do projeto Barcelona criou uma interface para gerenciamento de recursos ( Resource Management - RM - interface), implementada baseada nas isoladas do MVM. Referência Bibliográfica HEISS, Janice J.. The Multi-Tasking Virtual Machine: Building a Highly Scalable JVM. Disponível em < http://java.sun.com/developer/technicalArticles/Programming/mvm/>. Acesso em 10 de maio de 2008.