2010-06-29 2 views
14

Mi piacerebbe sapere come, o se è possibile, interagire programmaticamente con un'applicazione java black-box (leggendo i suoi dati). Ci sono state ricerche/lavori precedenti su questo genere di cose?È possibile leggere la memoria di un'applicazione java in esecuzione?

mi immagino che in esecuzione su una JVM complica notevolmente le cose.

@anon: fare questo con qualsiasi JVM è rilevante. È necessario conoscere o controllare le specifiche di come la JVM alloca la memoria per estrarre i dati da un'applicazione java?

+1

In esecuzione su una JVM arbitraria o su una particolare JVM commerciale o su una JVM sviluppata appositamente per questo scopo? esecuzione su una macchina virtuale invece di un vero e proprio uno fa le cose più facili * * se controlli i meccanismi interni VM, e anche se non lo fai, non lo rende affatto più duro fino a quando si sa che cosa questi interni sono. –

+0

Un thread correlato da applicare qui: http://stackoverflow.com/questions/2771868/can-i-access-object-from-another-jvms-memory-without-requesting-that-jvm – Greg

+1

Forse l'interfaccia del debugger aiuta http://java.sun.com/j2se/1.3/docs/guide/jpda/jvmdi-spec.html – josefx

risposta

2

Si potrebbe guardare in java.lang.instrument. Finché comprendi la struttura di classe dell'applicazione, ti permetterà di modificare i metodi in una JVM già in esecuzione e potresti essere in grado di creare un modo che ti consenta di estrarre o inserire dati sufficienti per comunicare (dipende dai metodi disponibile, ovviamente).

+0

Grazie, non ne avevo mai sentito parlare e sembra promettente. Immagino che utilizzarlo in combinazione con gli strumenti di profilazione potrebbero essere utili anche altre risposte. –

0

Il gruppo Sable della McGill University ha contribuito con molte ricerche al mondo di Java.

Gran parte del lavoro sta diventando piuttosto datato, ma potresti trovare aiuto nel loro progetto EVolve che ha lo scopo di visualizzare programmi orientati agli oggetti. Alcuni dei loro progetti sembrano essere mantenuto attivamente (come Soot, il loro quadro di ottimizzazione Java), quindi si potrebbe trovare fortuna li contattando direttamente

0

Credo che quello che stai cercando è quello che il Eclipse MAT fa. Si potrebbe voler dare un'occhiata al codice sorgente ...

0

La JVM HotSpot permette di collegare un agentlib da un profiler (vedi Open Source Java Profilers o spot pubblicitari come Your Kit), nel profiler si può quindi ispezionare la memoria/cpu/threads ecc. Se si desidera materiale specifico, è possibile creare un proprio agentlib che invii informazioni sulla jvm di cui si ha bisogno.

1

È facilmente possibile con, ad esempio, StackTrace. Può essere collegato a un processo Java e consente di ispezionare e modificare quasi tutto con BeanShell.

+0

Sembra che il link sia rotto? –