2009-09-17 10 views
8

Wykonuję inną maszynę JVM (java.exe) z głównej aplikacji. Czy istnieje sposób na udostępnienie obiektu (raczej dużego obiektu) nowemu procesowi (w momencie utworzenia lub po jego utworzeniu).Udostępnianie obiektów w procesach Java

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("java -cp " + tempDir + jarsInPath + " " + appMain); 

Teraz chcę obiekcie tak aby mieć dostęp do procesu oznaczonego przedmiotu proc

Does ProcessBuilder zapewniają żadnych narzędzi do tego celu?

Odpowiedz

0

Nie ma obsługi pamięci współużytkowanej w Javie.

Najprostszym sposobem rozwiązania tego problemu jest serializacja obiektu do pliku tymczasowego, a następnie przekształcenie go w nową maszynę JVM.

+0

Pracuję z kompilatora (rozszerzenie Java). Muszę wstępnie przetworzyć AST, który generuje różne AST. Aby je przetworzyć, muszę ponownie wywołać kompilator. Zamiast wykonywać je osobno, chcę usprawnić ten proces. Obecnie po prostu ponownie parsuję oryginalny program java w nowym procesie. Próbowałem serializować, ale raczej duży obiekt (dokładny program) z wieloma strukturami danych. – user174819

1

Możesz udostępnić usługę, aby umożliwić dostęp do danych z obiektu. Stosowanie RMI jest stosunkowo łatwe w konfigurowaniu komunikacji między procesami. Będzie to miało wpływ na IPC, więc nie będzie to tak wydajne jak dostęp lokalny, dostęp do szczegółów będzie kosztowny, ale jeśli otrzymujesz streszczenie lub inne dane agregowane, to może to być przyzwoity model.

Nie mówisz, dlaczego są to oddzielne procesy. Czy masz możliwość załadowania kodu procesu potomnego bezpośrednio do rodzica? Dynamiczne ładowanie i rozładowywanie jest możliwe.

+0

W jaki sposób mogę "wprowadzić kod twojego procesu potomnego bezpośrednio do rodzica". Ponadto nie chcę, aby dane z procesu potomnego przesyłały dane tylko z procesu nadrzędnego do procesu potomnego? – user174819

+0

Rodzic-> dziecko, dziecko-> rodzic, nie robi różnicy, jeden zapewnia usługę, którą inni nazywają. Ale moim głównym pytaniem było, dlaczego są one w ogóle oddzielnymi procesami? Wystarczy jeden wielki proces, w którym wątki wykonują różne zadania. W zależności od potrzeb można po prostu połączyć jeden duży program lub dynamicznie wczytać klasy za pomocą standardowych interfejsów Java API – djna

+0

Można by sądzić, że jest to ograniczenie modelu architektury JVM. Dostarczanie warstw serwisowych pozbawionych tego obiektu staje się dość trudne. Nawet masaż przechodzący przez systemy operacyjne będzie korzystał z udostępnionych obiektów i usług. – will

3

Jeśli chcesz udostępniać obiekty, najlepszym sposobem jest użycie wątków zamiast oddzielnego procesu. Procesy nie mogą współużytkować pamięci (z wyjątkiem JNI), więc musisz skopiować duży obiekt tam i z powrotem w postaci szeregowej, albo za pośrednictwem plików, albo za pośrednictwem połączenia z gniazdem RMI (przy czym ta druga opcja jest lepsza, ponieważ powoduje nieodłączną synchronizację) .

+0

Czy można użyć wątku do uruchomienia kolejnej maszyny JVM (java.exe), jak w powyższym kodzie? Zawsze widziałem proces używany do uruchamiania innej maszyny JVM. – user174819

+0

Nie, nie możesz uruchomić kolejnej maszyny JVM - wtedy byłby to proces, a nie wątek. Ale czy naprawdę POTRZEBUJESZ kolejnej maszyny JVM? Czy nie możesz po prostu uruchomić metody main(), w której chcesz uruchomić nową maszynę JVM w wątku? –

0

jestem, że można użyć rozproszonych pamięci podręcznej dla tego celu (ehcache, memcached i tak dalej ...)

Powiązane problemy