Tudo sobre Java, Java Runtime e aplicativos Java
O que é Java?
Java é uma linguagem de programação orientada a objetos, criada nos anos 90 com o codinome Green Project, por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems.
Naquela época, o que existia no mercado de desenvolvimento eram aplicações de arquitetura cliente servidor, onde cada aplicação era executada em um servidor isolado, ou cluster de servidores, e principalmente, em um ambiente desktops e um terminal ou interface de acesso à aplicação remota.
A proposta do Java era ser uma linguagem multi plataforma, que permitisse reaproveitar o mesmo código em ambientes operacionais distintos como: celulares, desktops, servidores, automóveis, televisores entre outros.
Dessa forma, a linguagem não poderia ser compilada, porque para isso, são necessárias dependências de plataforma, assim, o Java foi concebido como linguagem de compilação abstraída, que precisa de um componente que faça intermédio entre o código desenvolvido e a versão do sistema operacional.
O que é uma Máquina Virtual?
A Máquina virtual é uma representação fiel de uma máquina física.
Podemos estabelecer que a máquina virtual é uma máquina guest, e a máquina física que hospeda esse guest, é o host.
Um host pode executar inúmeras máquinas virtuais simultaneamente sem uma depender da outra.
Em linguagens de programação como C e C++, o código é primeiramente compilado para uma plataforma específica, elas são conhecidas como Linguagens Compiladas.
Por outro lado, linguagens de programação como Python, Perl, Java Script e VB Script, são interpretadas diretamente, sem a necessidade de compilação. Elas são conhecidas como Linguagens Interpretadas.
O Java combina essas duas estratégias, uma linguagem pré compilada e uma interpretada.
O código em Java é inicialmente compilado em um bytecode para gerar o arquivo de classes, e somente após isso, ele é interpretado pela Java Virtual Machine, em uma respectiva plataforma ao qual a JVM está rodando.
Muito semelhante a Máquina Virtual, a JVM cria espaços isolados no host. Isso garante independência do código para a plataforma que está executando, e esses espaços, podem ser usados para executar inúmeros programas Java.
O que é uma Máquina Virtual?
A Java Virtual Machine (JVM) é responsável por executar a maior parte das aplicações Java ao redor do mundo, desde o seu lançamento, ela criou diversas facilidades e bibliotecas para facilitar a vida do desenvolvedor, atualmente a JVM encontra-se na 8ª versão.
A JVM garante interoperabilidade entre tipos de servidores e gerenciamento de recursos como: memória, threads e linking. Com esta facilidade, o desenvolvedor não se preocupa em gerenciar recursos de memória, linking e dependências de bibliotecas.
Desafios da Java Virtual Machine (JVM)?
Quando falamos em ambientes de aplicações atualmente, basicamente estamos falando de containers, kubernetes, API, build pipeline e etc.
Essa é a nova cultura adotada pelas empresas ao redor do mundo “Cloud Native”.
Migrar uma aplicação legada Java, que antes executava em um servidor JBoss ou wildfly para o ambiente de containers funciona, porém não foi para isso que o Java foi criado.
Será um navio sendo empurrado por um propulsor pequeno.
Nas palavras do desenvolvedor, quando tratamos um ambiente ágil de desenvolvimento ou até mesmo DevOps, escrever códigos e fazer builds e mais builds durante um único dia, não fica legal com o Java legado, isso porque o processo de build é bastante demorado e carregado.
Por uma característica da JVM, que possui um recurso de desalocação de memória chamado Garbage Collector, que marca um objeto na memória que não esteja mais sendo referenciado pela aplicação e depois limpa o espaço na memória, essa atuação em uma máquina virtual com JBoss é extremamente importante para a manutenção da memória, porém em um container, isso não faz sentido, o container é efêmero e se ele tiver com pouca memória, o kubernetes irá matá-lo.
Não podemos dizer que a JVM está com os dias contados, porém novas tecnologias com maior aderência e apelo Cloud Native terão espaço maior de utilização. O que faz o Garbage Collector: ele marca um objeto na memória que não esteja mais sendo referenciado pela aplicação e depois limpa o espaço na memória.