Можно ли читать память запущенного Java-приложения?

Я хотел бы узнать, как, или, если это вообще возможно, программно взаимодействовать с Java-приложением черного ящика (читая его данные). Были ли какие-либо предыдущие исследования/работы по выполнению такого рода вещей?

Я бы предположил, что работа на JVM значительно усложняет ситуацию.

@anon: Выполнение этого с помощью любой JVM имеет значение. Вам нужно знать или контролировать особенности того, как JVM выделяет память для извлечения данных из приложения Java?

Ответы

Ответ 1

Вы можете посмотреть java.lang.instrument. До тех пор, пока вы понимаете структуру класса приложения, он позволит вам изменить методы в уже запущенной JVM, и вы сможете придумать способ, который позволяет извлекать или вставлять данные достаточно для общения (зависит от методов доступно, конечно).

Ответ 2

Это легко, например, с помощью StackTrace. Он может присоединяться к процессу java и позволяет вам проверять и изменять почти все с помощью BeanShell.

Ответ 3

Группа Sable в Университете МакГилла внесла большой вклад в мир Java.

Большая часть работы довольно устарела, но вы можете найти некоторую помощь в проекте EVolve, целью которого является визуализация объектно-ориентированные программы. Некоторые из их проектов, похоже, активно поддерживаются (например, Soot, их инфраструктура оптимизации Java), поэтому вы можете найти удачу, связавшись с ними напрямую

Ответ 4

Я верю, что вы ищете, что делает Eclipse MAT. Вы можете взглянуть на исходный код...

Ответ 5

JVM HotSpot позволяет подключить агентский листинг от профилировщика (см. Java-профилиры с открытым исходным кодом или рекламные ролики, такие как Your Kit), в профилировщике вы можете проверить память /cpu/threads и т.д. Если вам нужны очень конкретные материалы, вы можете создать свой собственный агент, который отправит вам информацию о jvm, который вам нужен.