2016-10-18 4 views
6

Мне нужно остановить процесс, вызвав конкретный метод для экземпляра данного класса. Процесс работает целый день, и если я его сильно закрою, я потеряю много работы. Из-за ошибки в API графический интерфейс неправильно подключен и не вызывает правильную функцию остановки. У меня есть интерактивный интерпретатор Java (Scala), поэтому, если бы я мог получить экземпляр процесса, я мог бы легко вызвать правильный метод.JVM - получить экземпляр класса в запущенной (неинструментарной) сессии

У меня нет сеанса отладки, нет com.sun.jdi. Я могу увидеть экземпляр в дампе трассировки стека, но StackTraceElement не содержит фактических экземпляров, просто классов и номеров строк.

Есть ли какой-либо способ в проходящем сеансе без специального инструментария, чтобы получить этот экземпляр - через его класс через дамп потока?

+0

AFAIK ...... нет. –

+0

Вы можете использовать [Attach API] (http://docs.oracle.com/javase/8/docs/technotes/guides/attach/), чтобы принудительно загрузить агента в запущенную виртуальную машину, если вы находитесь на одна и та же машина. Если JVM не поддерживает это, шансы низкие ... – Holger

+0

@Holger благодарит, что выглядит интересно. Я нахожусь в HotSpot, поэтому, полагаю, это сработает. У вас есть указатель на «пример вложения»? –

ответ

2

Можно получить все экземпляры данного класса, используя функцию JVMTI IterateOverInstancesOfClass. См. Пример в this answer.

Создайте библиотеку JNI, которая найдет требуемый экземпляр, используя указанную выше функцию, и вызовет метод на нем из записи JNI_OnLoad. Затем вызовите System.load из консоли интерпретатора, чтобы загрузить эту библиотеку.

Смежные вопросы