Приостановка JVM на ограниченное время - PullRequest
2 голосов
/ 20 апреля 2010

Как я могу приостановить выполнение JVM на настраиваемый промежуток времени, аналогично тому, как это требуется в полной последовательной сборке мусора? Я хочу протестировать некоторые крайние случаи, но сложно создать точные паузы, которые мне нужны, с помощью генерации мусора вручную + System.gc().


Я пытаюсь «заморозить» все потоки в приложении, чтобы смоделировать ситуацию, когда приложение перестает отвечать на запросы, а затем возобновляет выполнение. Приложение является частью кластера, и я пытаюсь отладить некоторые проблемы с выходом / присоединением / повторным объединением.

Ответы [ 4 ]

3 голосов
/ 26 декабря 2012

JVM приостановить можно из командной строки с помощью jdb :

jdb -attach 8787
Initializing jdb ...
> suspend
All threads suspended.
> resume
All threads resumed.
> exit

Но для этого требуется, чтобы он был запущен с -Xdebug ...

Существует также универсальный способ приостановить и возобновить любой процесс в Linux / Unix:

kill -SIGSTOP PID
kill -SIGCONT PID

См. Также Как приостановить / возобновить процесс в Windows?

3 голосов
/ 20 апреля 2010

При отладке из Eclipse вы можете приостановить все потоки, я думаю, что другие отладчики позволяют это делать. Поэтому вам необходимо запустить сервер с параметрами отладки JVM и подключиться к нему удаленно.

В моем случае (работает JBoss) я изменяю скрипт запуска, добавляя эту строку:

set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%

Затем в Eclipse, Выполнить -> Отладочные конфигурации -> Удалить приложение Java -> Создать

Обычно вам просто нужно указать имя хоста и порт.

2 голосов
/ 20 апреля 2010

Используйте виртуальную машину и немедленно приостановите ее выполнение.

1 голос
/ 20 апреля 2010

Я думаю, что вы, вероятно, хотите что-то менее инвазивное, но один из подходов состоит в том, чтобы управляющий поток получил блокировку, а затем все другие потоки также попытались получить эту блокировку. Затем проследите, чтобы управляющий поток спал столько времени, сколько вам нужно, прежде чем его бросить Немного менее неуклюжая версия этого состояла бы в том, чтобы использовать семафор с одним разрешением на поток, а затем заставить управляющий поток получить их все, прежде чем все другие потоки попытаются получить разрешение.

Как я уже сказал, это довольно агрессивно, вам придется взламывать это в своем коде для каждого потока.

Другим подходом было бы запустить ваш код в отладчике и вручную приостановить каждый поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...