У меня возникла сложная проблема с моим текущим кодом (который довольно большой). Чтобы выполнить мою задачу, нам пришлось сделать много вызовов методов вокруг вызовов вызовов 100-120 (пожалуйста, не спрашивайте меня, почему я это делаю, это полностью развязанная реализация). Чтобы предоставить больше контекста, это приложение Java swing. Когда я выполняю 10-кратное действие, около 3-4 итераций времени для завершения действия очень велико (примерно на 300 миллисекунд). Я попытался добавить больше журналов, чтобы найти, какой вызов метода занимает больше времени. То, что я могу заметить, это то, что пик не всегда в одном месте, когда я добавляю больше журналов, я вижу, что пикид немного подтолкнул, когда я удалил какой-то фрагмент кода. Это ясно показывает, что какой-то фоновый поток фактически блокирует мое выполнение (может быть, из-за среза нити или голодания нитью), все может быть причиной. Придя к вопросу, я не знаю, какая из фоновых потоков прерывает меня. Поэтому я хотел бы знать, есть ли какой-либо способ (через параметры времени выполнения Java), чтобы я мог печатать на консоли, какой поток приостановлен и какой поток возобновляет его выполнение?Обнаружение того, какой поток Java вторгается в мой метод.
ответ
Чтобы узнать имя нити, которые называют метод, попробуйте следующее:
public void myMethod(){
String threadName = Thread.currentThread().getName();
System.out.println("Thread name : " + threadName);
}
Проблема не в том, как найти имя потока. Здесь мы хотели бы знать, какая нить вторгается в наш поток. –
Что я делаю, это есть поток мониторинга, который периодически проверять, что латентный чувствительная задача завершается вовремя. Когда это не так, он печатает трассировку стека потока (и, возможно, любых других интересующих потоков). Это может быть полезно для отслеживания скрытого дрожания задержки.
Проблема в том, что все темы, которые мы догадались, которые могли бы вторгаться в наш процесс, не являются тем, что вторгается. Мы подтвердили это, добавив некоторые журналы в подозрительный поток, пока он возобновляет выполнение. Любая идея, будет ли здесь -Djavaplugin.trace = true полезной? –
С помощью программного обеспечения профилировщика мы обнаружили, что он был связан с VM Thread внутри JVM. Любая идея, что такое VM Thread? –
@RengasamiRamanujam Резьба VM используется для критических операций остановки, таких как GC и стеки. http://blog.jamesdbloom.com/JVMInternals.html Если это очень важно, я бы посмотрел на количество потоков, которые вы используете, и минимизируете их и минимизируете свою скорость распределения, например.создавать меньше мусора. –
Отладчик Eclipse IDE может показать, что поток ожидает другого (debugging Java synchronization). Вы должны прекратить выполнение в нужный момент времени, чтобы вы могли видеть, что происходит.
Это не сценарий, когда один поток ждет другого. Здесь один поток принудительно приостанавливает другой поток по какой-то причине. –
Можно попытаться установить условные точки останова в методах, например Thread.suspend, с условием проверки имени потока. – mm759
Это ясно показывает некоторые фоновый поток фактически блокирует мое исполнение
Что значит есть и другие темы, которые потребляют все циклы процессора и вызывают задержки в случайном порядке. Вам нужно следить за потреблением процессора в потоках и выяснять причину вины different ways to find the thread CPU usage
- 1. Какой метод Java вызвал мой конструктор?
- 2. Как узнать, какой поток вызвал мой метод журнала?
- 3. Обнаружение того, что метод вызывается без блокировки
- 4. Обнаружение, если поток работает в java fx
- 5. Обнаружение того, какой реактивный запрос был вызван
- 6. На какой поток запущен метод, инициированный NSTimer?
- 7. Какой поток Java забивает процессор?
- 8. Перезапуск мой основной метод после того, как мой метод boxPrint
- 9. Обнаружение того, какой конструктор VALUE использовался в значении
- 10. Как узнать, какой метод начал рабочий поток
- 11. Какой поток выполняет метод onNext() подписчика?
- 12. На какой поток работает этот метод? C#
- 13. Java: обнаружение цвета (например, мой синий цвет?)
- 14. Java или любой другой язык: какой метод/класс вызывал мой?
- 15. Темы: Как узнать, в какой поток работает метод?
- 16. java файл поток когда использовать какой?
- 17. Выход мой собственный поток в Java
- 18. Затянет ли мой поток Java на минуту?
- 19. Как заморозить мой jframe, пока поток программы происходит в java
- 20. Обнаружение того, как работает большой Java-код
- 21. Как зарегистрировать мой поток программы Java в базе данных?
- 22. Какой поток отвечает за то, что в Java
- 23. Поток данных, какой путь?
- 24. PHP - Какой класс вызвал мой статический метод?
- 25. Почему это объявление массива вторгается в следующий?
- 26. Как класс Java Thread определяет, какой поток?
- 27. Программно определить, какой поток Java содержит блокировку
- 28. Обнаружение того, подключен ли какой-либо сокет к любому url в системе в Java
- 29. Какой поток заканчивается многопоточным?
- 30. Обнаружение записи в стандартный поток ошибок
Я бы удостоверился, что gc не возникает в то время, когда вы видите задержку, вы можете добавить '-verbose: gc' в командную строку. –
Привет, у нас была эта строка в наших параметрах загрузки и обеспечила, что GC не работает между –
. Нет смысла обвинять фоновые потоки, когда, очевидно, ваш код регистрации изменяет время. Вместо этого вы должны просто использовать программное обеспечение для профилирования. Кроме того, в чем проблема с вызовом 120 методов? – Holger