Nossa, excelente pergunta. Estou curioso também.
Será que o mecanismo de um AS é similar ao OSGi, que também tem o esquema de substituir “a quente” módulos?
Parar e subir aplicações sem matar JVM
9 Respostas
Tem a questão do Hot Deploy, mas não sei falar como funciona. Sei que ao fechar a sessão e abrir novamente ela busca o “sistema novo”, caso não feche, continua o “sistema antigo”.
Sei que já passei muita raiva por causa disso, o servidor sempre trava, tem que reiniciar o serviço, fica lento…
Foi a minha experiencia, prefiro parar, fazer o Deploy e iniciar novamente.
Tem várias abordagens pra isso. O JBoss <= 6 utilizava estratégias de Classloaders. O JBoss 7, me parece, utiliza OSGi (digo porque os componentes nativos utilizam, não sei se a estratégia é a mesma para wars/ears). O WebLogic utiliza uma estratégia mista de VM’s gerenciadas e Classloaders.
Curiosidade: se interessar, dêem uma olhada no JRebel. É um mecanismo que otimiza esta carga/descarga de classes da memória (utilizando instrumentação + Classloader customizado).
[]'s
Curiosidade: se interessar, dêem uma olhada no JRebel. É um mecanismo que otimiza esta carga/descarga de classes da memória (utilizando instrumentação + Classloader customizado).[]'s
Eu ia falar desse cara mesmo, estou fazendo o Trial dele aqui e é excelente, realmente funciona muito bem e economiza muito tempo.
Só a licença que é beeeeeem salgada.
Sei que é abusar e tal, mas teria como disponibilizar esse PoC que você vai fazer no Git ou em outro lugar, para que possamos aprender tb?
É bom saber como a JVM funciona, como ela substitui as classes carregadas na memória, como funciona essa instrumentação. Tipo criar um mini-JRebel, só para ver como as coisas funcionam por detrás dos panos.
Tenho uma dúvida sobre servidores de aplicação e o funcionamento da JVM.Sabemos que é possível adicionar um war/ear a um AS iniciá-lo, usá-lo, pará-lo e substituir o war/ear por um outro.
Porém algumas de suas classes foram parar na memória. Gostaria de saber como essas classes são removidas de lá sem a necessidade de parar a JVM. Seria subindo através de um ClassLoader customizado? Ou há outra forma de fazer isso?
Não entendi a sua duvida. É exactamente assim que acontece. Vc joga fora o classloader e vai tudo embora com ele. Obviamente que apena quando o GC quiser, mas abstratamente, se o classloader é “esvaziado” a def das classes vai embora.
O que vai parar na memoria do Perggem são as strings , mas isso não tem problema porque é tudo internalized ou seja, se a mesma string é usada N vezes, apenas um objeto na memoria existe. O resto, é no classloader. Por exemplo os statics ficam no classloader.
Este é o mecanismo padrão. O OSGI usa este mecanismo por baixo dos panos , mas como é gerenciado pelo core do OGSI parece que é feito de outra forma, mas não é. E OSGI é mais chato que o classloader normal.
Tenho uma dúvida sobre servidores de aplicação e o funcionamento da JVM.
Sabemos que é possível adicionar um war/ear a um AS iniciá-lo, usá-lo, pará-lo e substituir o war/ear por um outro.
Porém algumas de suas classes foram parar na memória. Gostaria de saber como essas classes são removidas de lá sem a necessidade de parar a JVM. Seria subindo através de um ClassLoader customizado? Ou há outra forma de fazer isso?
O JRebel é interessante mas acredito que não seja uma opção.
Quero fazer uma PoC que tenha comportamento similar ao deploy de aplicações (citei war e ear apenas por questões de simplificar o entendimento).
Comecei a olhar um pouco o OSGi que talvez seja uma alternativa ao uso de ClassLoaders.
O uso de VMs gerenciadas está colocado como última opção (e, entre classloaders e vm gerenciada gostaria de avaliar outras opções).
Consegui alguns resultados interessantes. Vou ver se consigo colocar o que estou fazendo.
Por enquanto a PoC está um pouco “porca” para ser entendível (está naquele nível que somente quem fez entende hehehe).
De qualquer forma, estou trabalhando com um ClassLoader customizado mesmo a partir do exemplo no site do JavaBlogging: Java ClassLoader (2) ? Write your own ClassLoader
Os resultados obtidos foram bem interessantes e o código até que é bastante simples.
Por enquanto, estou descartando o uso de OSGi
Na verdade não tinha certeza de como funcionava. Me parecia lógico ser um classloader customizado mas se me perguntasse não responderia isso.
Por isso perguntei se era mesmo classloader ou se havia algo mais que fizesse isso.