Pergunta

Existem Java VMs que podem salvar seu estado em um arquivo e recarregar esse estado?

Se sim, quais são?

Foi útil?

Solução

Outra opção, que pode ou não ser relevante no seu caso, é executar a JVM (qualquer JVM) dentro de uma máquina virtual. A maioria das máquinas virtuais oferece a opção de armazenar e retomar o estado, então você deve Seja capaz de reiniciar o seu PC, acender a VM quando voltar e fazer com que o processo Java aumente de onde estava.

Eu uso o VMware Player para testar no IE no trabalho, e isso funciona como mencionado acima quando fecho e mais tarde reabro. Geralmente, não faço isso quando os aplicativos estão fazendo nada de nota na VM, mas desde que eles não estejam acessando nenhum recurso externo (por exemplo, soquetes de rede), eu esperaria que funcionasse como se a VM nunca fosse fechada .

Outras dicas

Continuações provavelmente são o que você está procurando:

...] continuações de primeira classe, que são construções que oferecem a uma linguagem de programação a capacidade de salvar o estado de execução em qualquer momento e retornar a esse ponto em um ponto posterior do programa.

Existem pelo menos duas bibliotecas de continuação para Java: Continuações RIFE e fluxo java.Eu sei que o javaflow permite pelo menos serializar o estado em disco:

A Continuation pode ser serializado se todos os objetos capturados também forem serializáveis.Em outras palavras, todas as variáveis ​​locais (incluindo todas thisobjetos) precisam ser marcados como Serializable.Neste exemplo, você precisa marcar a classe Mirunnable como serializável.Uma continuação serializada pode ser enviada para outra máquina ou usada posteriormente.- Tutorial Javaflow

Você deve serializar em serializar objetos relevantes específicos de domínio que podem ser despertalizados por outro tempo de execução da JVM.

Não estou ciente de nenhuma ferramenta que persista uma JVM inteira. O mais próximo que cheguei a fazer isso foi criar um dump central de um processo JVM em execução usando gcore, depois usando Jsadebugd, JMAP ou jstack para depurar.

Por exemplo:

$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX

ATUALIZAR

Eu não acho que você encontrará uma solução portátil entre arquiteturas ainda.

Vale a pena notar que muitos objetos não podem ser serializados, pois têm estado fora do contexto Java. Por exemplo, soquetes, threads, arquivos abertos, conexões de banco de dados. Por esse motivo, é difícil salvar o estado de um aplicativo útil de maneira genérica.

Não estou ciente das JVMs que podem armazenar estado. Dependendo das suas necessidades exatas, talvez você possa considerar o uso de terracota. A Terracota é essencialmente capaz de compartilhar o estado da HEAP entre a JVM e armazenar esse estado em disco.

Isso pode ser usado para agrupar aplicativos e/ou tornar o Heapstate persistente. Com efeito, você pode usá -lo para iniciar a JVM para cima e pegar de onde parou. Para mais informações, consulte:http://www.infoq.com/articles/open-terracotta-intro

Espero que isto ajude.

Eu trabalhei um projeto java incorporado que usou essa abordagem para iniciar rapidamente. A JVM era de Wind River, correndo em cima do VXWorks.

A Sun fez algumas pesquisas sobre "persistência ortogonal", que fornece "persistência para todo o modelo computacional que é definido pela especificação da linguagem Java":

http://research.sun.com/forest/com.sun.labs.forest.doc.opjspec.abs.html

PJAMA é uma implementação de protótipo:

http://research.sun.com/forest/opj.main.html

Que eu saiba, não há nada para capturar o estado da JVM e restaurá -lo, mas as pessoas estão tentando serializar/desserializar a classe de threads para alcançar algo semelhante. A coisa mais próxima de uma implementação funcional que encontrei foi freios, mas você pode encontrar mais quando pesquisar no Google para "serialização do thread".

Suponho que você deseja retomar de onde o instantâneo foi armazenado, como se nada depois tivesse acontecido.

Gostaria de saber quantos componentes da estrutura e bibliotecas que essa funcionalidade iria quebrar. De repente, você está revivendo um estado de JVM do armazenamento; Enquanto isso, o relógio foi misteriosamente avançado por 23 horas, as conexões de rede não são mais válidas, os objetos da GUI não têm mais nenhum alças de O/S subjacentes ... Eu diria que isso não é trivial e impossível no caso geral sem modificando a estrutura extensivamente.

Se você pode se safar apenas armazenando o estado de seus objetos na memória, então algo como Prevaylor Pode funcionar para você. Ele usa uma combinação de alterações de diário nos objetos de negócios com um instantâneo serializado para gravar o estado de seus objetos, que você pode recarregar posteriormente.

No entanto, ele não armazena o estado completo da JVM (pilha de chamadas, status GC etc). Se você realmente precisa desse nível de detalhe, pode -se necessário uma JVM especializada.

A resposta neste momento é não, não há JVMs que possam 'hibernar' como o seu sistema operacional pode ou como vmware et al.

Você poderia Chegue a meio caminho, dependendo da complexidade do seu aplicativo, apenas serializando o estado quando o programa se fechar e serializar-o de volta, mas isso não fará coisas como pausa executando alguma lógica de negócios quando você fechar e continuar quando você Abra novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top