상태를 파일에 저장 한 다음 해당 상태를 다시로드 할 수있는 Java VM이 있습니까?

StackOverflow https://stackoverflow.com/questions/424341

문제

상태를 파일에 저장 한 다음 해당 상태를 다시로드 할 수있는 Java VM이 있습니까?

그렇다면 어느 것이?

도움이 되었습니까?

해결책

귀하의 경우 관련이 있거나 관련이 없을 수도있는 또 다른 옵션은 가상 컴퓨터 내에서 JVM (모든 JVM)을 실행하는 것입니다. 대부분의 가상 머신은 상태를 저장하고 재개 할 수있는 옵션을 제공하므로 ~해야 한다 PC를 다시 시작하고 VM을 다시 올릴 때 VM을 발사하고 Java 프로세스가 있었던 곳에서 Java 프로세스를 픽업 할 수 있습니다.

직장에서 IE를 테스트하기 위해 VMware 플레이어를 사용하며,이를 닫고 나중에 다시 열 때 위에서 언급 한대로 작동합니다. 앱이 VM에서 주목할만한 일을 할 때 일반적 으로이 작업을 수행하지 않지만 외부 리소스 (예 : 네트워크 소켓)에 액세스하지 않는 한 VM이 종료되지 않은 것처럼 작동 할 것으로 기대합니다. .

다른 팁

연속 아마도 당신이 찾고있는 것일 것입니다.

...] 일등석 연속은 프로그래밍 언어에 모든 시점에서 실행 상태를 저장하고 프로그램의 후반에 해당 지점으로 돌아갈 수있는 능력을 제공하는 구성 요소입니다.

Java에는 최소 2 개의 연속 라이브러리가 있습니다. 연속성 그리고 Javaflow. Javaflow가 적어도 직렬화 상태가 디스크에 허용된다는 것을 알고 있습니다.

Continuation 캡처 한 모든 객체도 직렬화 할 수있는 경우 직렬화 할 수 있습니다. 다시 말해, 모든 로컬 변수 (모두 포함 this객체)를 표시해야합니다 Serializable. 이 예에서는 Myrunnable 클래스를 직렬화 가능한 것으로 표시해야합니다. 직렬화 된 연속은 다른 기계로 전송되거나 나중에 사용될 수 있습니다. - Javaflow 튜토리얼

다른 JVM 런타임에 의해 해제 될 수있는 관련 도메인 별 개체를 직렬화해야합니다.

전체 JVM을 지속하는 도구는 모릅니다. 내가 이것을 가장 가까운 것은 실행중인 JVM 프로세스에서 코어 덤프를 만드는 것이 었습니다. Gcore, 그런 다음 사용합니다 Jsadebugd, JMAP 또는 Jstack 디버깅.

예를 들어:

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

업데이트

나는 당신이 아직 아키텍처 사이에서 휴대 할 수있는 솔루션을 찾을 것이라고 생각하지 않습니다.

많은 객체는 Java 컨텍스트 외부에 상태가 있기 때문에 직렬화 될 수 없다는 점은 주목할 가치가 있습니다. 예를 들어 소켓, 스레드, 열린 파일, 데이터베이스 연결. 이러한 이유로 유용한 응용 프로그램의 상태를 일반적인 방식으로 저장하기는 어렵습니다.

나는 주를 저장할 수있는 JVM을 모른다. 정확한 요구에 따라 Terracotta 사용을 고려할 수 있습니다. Terracotta는 본질적으로 JVM 사이에 힙 상태를 공유 하고이 상태를 디스크에 저장할 수 있습니다.

이것은 응용 프로그램을 클러스터하고/또는 힙 상태를 지속적으로 만드는 데 사용될 수 있습니다. 사실상, 당신은 그것을 사용하여 JVM을 시작하고 당신이 멈춘 곳을 픽업 할 수 있습니다. 자세한 내용은 확인하십시오.http://www.infoq.com/articles/open-terracotta-intro

도움이 되었기를 바랍니다.

나는 일했다 임베디드 자바 프로젝트 이 접근법을 사용하여 신속하게 시작했습니다. JVM은 Wind River 출신이며 VXWorks 위에서 달렸습니다.

Sun은 "직교 지속성"에 대한 연구를 수행했으며, 이는 "Java 언어 지정으로 정의 된 전체 계산 모델에 대한 지속성"을 제공합니다.

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

Pjama는 프로토 타입 구현입니다.

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

내가 아는 한, JVM 상태를 캡처하고 복원 할 수있는 것은 없지만 사람들은 스레드 클래스를 직렬화/사제 화하여 비슷한 것을 달성하려고합니다. 내가 찾은 작업 구현에 가장 가까운 것은 브레이크, 그러나 "스레드 직렬화"를 위해 Google에서 더 많은 것을 찾을 수 있습니다.

나는 당신이 스냅 샷이 저장된 곳에서 재개 할 수 있기를 원합니다.

그러한 기능이 얼마나 많은 프레임 워크 구성 요소와 라이브러리가 깨지는지 궁금합니다. 갑자기, 당신은 저장에서 JVM 상태를 부활시키고 있습니다. 그 동안 시계는 23 시간까지 신비하게 건너 뛰었고, 네트워크 연결은 더 이상 유효하지 않으며, GUI 객체에는 더 이상 기본 O/S 핸들이 없습니다 ... 이것은 사소한 일이며 일반적인 경우에는 불가능하다고 말합니다. 프레임 워크를 광범위하게 수정합니다.

메모리 내 개체의 상태를 저장하면서 도망 갈 수 있다면 Prevaylor 당신을 위해 일할 수 있습니다. 직렬화 된 스냅 샷으로 비즈니스 객체에 대한 저널링 변경을 사용하여 객체의 상태를 기록한 다음 나중에 다시로드 할 수 있습니다.

그러나 전체 JVM 상태 (통화 스택, GC 상태 등)를 저장하지 않습니다. 실제로 해당 세부 수준이 필요한 경우 전문화 된 JVM이 필요할 수 있습니다.

이 시점의 대답은입니다 아니요, 운영 체제가 VMware et al Can과 같은 것처럼 '최대 절전 모드'할 수있는 JVM은 없습니다.

~할 수 있었다 프로그램이 문을 닫을 때 상태를 연속화하고 다시 연속화하여 앱의 복잡성에 따라 반쯤 갈 수 있지만, 닫을 때 일부 비즈니스 로직을 실행 한 다음 계속할 때 계속 일시 중지하는 것과 같은 일을하지 않습니다. 다시 열십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top