Можно ли читать память запущенного 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, который вам нужен.