2012-01-26 13 views
15

Zastanawiam się, czy to możliwe, aby zrzucić uruchomiony program Java do pliku, a później ponownie go uruchomić (samo urządzenie)Dumping program Java do pliku i ponowne uruchomienie go

To brzmi nieco dziwnie, ale kto wie

--- aktualizacji -------

Tak, to jest funkcja hibernacji dla procesu zamiast pełnego systemu. Ale google "proces hibernacji jvm" i zrozumiesz mój ból.

Jest pytanie dotyczące systemu Linux na ten temat (here). Szybko można hibernować proces (daleki od 100% niezawodności) za pomocą CryoPID.

Podobne pytanie pojawiło się kilka lat temu w stackoverflow.

W przypadku JVM moje wykształcone przypuszczenie jest takie, że hibernacja powinna być o wiele łatwiejsza, nie zawsze możliwa i niezawodna w 100% (np. Interfejs użytkownika i pliki).


Szeregowanie trwałego stanu aplikacji jest opcją, ale nie jest odpowiedzią na pytanie.

+0

Masz na myśli coś podobnego do tworzenia pliku zapisu? – Max

+0

Pamiętam, jak wiele lat temu czytałem instrukcje, jak zinterpretować interpreter awk podczas uruchamiania programu awk, a następnie ponownie uruchomić go z pliku core. W tym czasie myślałem, że to całkiem szalone. –

+0

To brzmi dziwnie. Czy mówisz o zrzuceniu kodu źródłowego uruchomionego programu Java do pliku tekstowego, kompilacji tego kodu źródłowego i uruchomienia go? – Bernard

Odpowiedz

10

To może mnie trochę przesadzić, ale jedną rzeczą, którą możesz zrobić, to uruchomić coś w rodzaju VirtualBox i zatrzymać/zapisać maszynę.

Istnieje również:
- JavaFlow from Apache które powinny nie tylko, że choć ja osobiście nie próbował go.
- Brakes że może być dokładnie to, czego szukasz

+0

To pytanie/odpowiedź sugeruje również przejście na trasę VM: http://stackoverflow.com/questions/424341/are-there-any-java-vms-which-can-save-their- stan-to-a-file-and-then-reload-that – jefflunt

7

wierzę co PO pyta, co chłopaki robią Smalltalk zostały przez dziesięciolecia - przechowywać całe środowisko programowania/wykonanie w pliku obrazu, a prace na tym.

AFAIK nie ma sposobu, aby zrobić to samo w Javie.

+0

Możesz to zrobić z Smalltalk? Czy istnieje nazwa tej funkcji, więc mogę ją Google? – Ajedi32

+0

Zobacz, jak zapisać Smalltalk _image_, który powinien Cię ustawić na właściwej ścieżce;) –

7

Trwają badania nad "utrwaleniem" stanu wykonania maszyny JVM, a następnie przeniesieniem jej do innej maszyny JVM i ponownym uruchomieniem. Zauważyłem coś, co zademonstrowałem raz, ale nie pamiętam, który. Nie sądzę, że została unormowana w specyfikacji JVM mimo ...

Znaleziony prezentacji/demo myślałem o, to było w 2005 OOPSLA że rozmawiali o squawk

Powodzenia!

Inne interesujące linki: Merpati

Aglets

M-JavaMPI

+0

Dzięki, zbliżamy się – ic3

+0

Powodzenia i odeślij, jeśli znajdziesz dobre rozwiązanie :) –

2

Chyba IDE obsługuje debugowania w taki sposób. Nie jest to niemożliwe, choć nie wiem jak. Być może dostaniesz szczegóły, jeśli skontaktujesz się z jakimś kontrputerem zaćmienia lub netbeana.

7

Istnieje wiele ograniczeń, które rozwiążą Twój problem: wszystkie połączenia zewnętrzne mogą przetrwać próbę zamrożenia i przebudzenia.Pomyśl o limitach czasu po drugiej stronie, a nawet o zatrzymanych partnerach komunikacyjnych - od serwera internetowego do bazy danych, a nawet plików lokalnych.

Pytasz o ogólne rozwiązanie bez wewnętrznej znajomości programu, które chciałbyś hibernować. To co zawsze możesz zrobić, to serializacja tej części stanu twojego programu, która wymaga ponownego uruchomienia twojego programu. Jest to, lub przynajmniej była powszechna mądrość, aby zaimplementować punkt ponownego uruchomienia w długich obliczeniach (myśleć o dniach lub tygodniach). Tak więc, kiedy trafisz na błąd w programie po jego uruchomieniu na tydzień, możesz naprawić błąd i zaoszczędzić kilka dni obliczeniowych.

Stan programu może być zaskakująco mały w porównaniu z pełnym rozmiarem używanej pamięci.

Zapytałeś "czy możliwe jest zrzucenie uruchomionego programu Java do pliku, a następnie ponowne uruchomienie go." - Tak, ale nie sugerowałbym ogólnego i automatycznego rozwiązania, które musi obsługiwać twój program jako czarną skrzynkę, ale sugeruję, abyś przekazał na zewnątrz ważną część punktów programu i punktów restartu programu.

Nadzieja, która pomaga - nawet jeśli jest bardziej skomplikowana, niż można się było spodziewać.

+1

Załóżmy, że scenariusz nie ma zewnętrznych zasobów (pliki, db, połączenia ...) – ic3

+0

jeśli jest to pytanie z prawdziwego świata, co robi aplikacja: czy jest to gra, liczba cykli, symulacja? –

+0

To jest pytanie na świecie, to serwer OLAP (google iccube) – ic3

3

Co powiesz na temat korzystania z frameworków SpringBatch?

O ile zrozumiałem z twojego pytania, potrzebujesz niezawodnego i wznawianego zadania java, jeśli tak, wierzę, że Spring Batch zrobi magię, ponieważ możesz podzielić swoje zadanie (zadanie) na kilka kroków podczas każdego kroku (a także całe zadanie) ma swój własny kontekst wykonywania utrzymywany w pamięci, z którą zdecydujesz się pracować.

W przypadku awarii można odzyskać, analizując poprzedni przebieg określonego zadania i wznowić go od dokładnego punktu, w którym wystąpił błąd.

Można także wstrzymać i wykonać restart your job programmatically, jeśli zadanie zostało skonfigurowane jako możliwe do ponownego uruchomienia, a Kontekst wykonania dla tego zadania już istnieje.

Powodzenia!

0

Po pierwsze musisz zaprojektować swoją aplikację, aby korzystać z Memento pattern lub dowolnego innego wzoru, który pozwala zapisać stan aplikacji. Wzorzec obserwatora może być również możliwy. Gdy twój kod jest skonstruowany w taki sposób, że stan zapisu jest możliwy, możesz użyć serializacji Java, aby wypisać wszystkie obiekty itp. Do pliku, zamiast umieszczać go w DB.

Tylko o 2 centy.

0

To, czego oczekujesz, jest niemożliwe z samej natury architektury komputerowej.

Każdy program w języku Java jest kompilowany do pośredniego kodu Java, a kod ten jest interpretowany jako macierzysty kod platformy (po uruchomieniu). Natywny kod różni się znacznie od tego, co widzisz w plikach Java, ponieważ zależy to od podkreślania platformy i wersji JVM. Każda platforma ma inny zestaw instrukcji, zarządzanie pamięcią, system sterowników itp. Wyobraź sobie, że hibernowałeś swój program w systemie Windows, a następnie uruchamiałeś go na Linuksie, Macu lub innym urządzeniu z JRE, takim jak telefon komórkowy, samochód, czytnik kart , itd ... Wszystko się rozpadnie.

Rozwiązaniem jest serializacja każdego ważnego obiektu do plików, a następnie zamknięcie programu z wdziękiem. Kiedy "unhibernating", ty deserialize te wystąpienia z tych plików i twój program może kontynuować. Liczba "ważnych" instancji może być dość mała, wystarczy zapisać "dane biznesowe", a wszystkie inne dane można odtworzyć z tych danych. Możesz użyć Hibernate lub dowolnej innej struktury ORM, aby zautomatyzować tę serializację na bazie SQL.

+0

Pytanie nie powoduje hibernacji w jednym systemie operacyjnym i rozpoczęcia pracy w innym. – ic3

+0

Myślałem, że poprosiłeś o hibernację stanu JVM. Plik ten można następnie przenieść na dowolny inny komputer. –

+0

jeśli to możliwe, byłoby to naprawdę świetne – ic3

0

Prawdopodobnie Terracotta może to: http://www.terracotta.org

Nie jestem pewien, ale są one wspieranie awarii serwera. Jeśli wszystkie serwery zatrzymają się, proces powinien zostać zapisany na dysku i czekać, jak sądzę.

W przeciwnym razie należy refaktoryzować aplikację, aby zachować stan jawnie. Na przykład, jeśli zaimplementujesz coś w stylu działającego i sprawisz, że będzie on szeregowalny, będziesz mógł go zapisać.

3

Wierzę: 1- Jedyny ogólny sposób to wdrożenie serializacji. 2- dobrym sposobem na przywrócenie działającego systemu jest wirtualizacja OS 3- teraz pytasz o coś w rodzaju serializacji pojedynczego procesu.

Problem stanowią OI. Mówi, że proces używa pliku tymczasowego, który zostaje usunięty przez system po "hybernacji", ale twój program go nie zna. Będziesz miał gdzieś IOException .

Tak więc, jeśli program nie został zaprojektowany tak, aby był przerywany losowo, nie zadziała. To ryzykowne i nieopłacalne rozwiązanie, więc uważam, że tylko 1,2 ma sens.

Powiązane problemy