2016-07-16 2 views
0

У меня возникла сложная проблема с моим текущим кодом (который довольно большой). Чтобы выполнить мою задачу, нам пришлось сделать много вызовов методов вокруг вызовов вызовов 100-120 (пожалуйста, не спрашивайте меня, почему я это делаю, это полностью развязанная реализация). Чтобы предоставить больше контекста, это приложение Java swing. Когда я выполняю 10-кратное действие, около 3-4 итераций времени для завершения действия очень велико (примерно на 300 миллисекунд). Я попытался добавить больше журналов, чтобы найти, какой вызов метода занимает больше времени. То, что я могу заметить, это то, что пик не всегда в одном месте, когда я добавляю больше журналов, я вижу, что пикид немного подтолкнул, когда я удалил какой-то фрагмент кода. Это ясно показывает, что какой-то фоновый поток фактически блокирует мое выполнение (может быть, из-за среза нити или голодания нитью), все может быть причиной. Придя к вопросу, я не знаю, какая из фоновых потоков прерывает меня. Поэтому я хотел бы знать, есть ли какой-либо способ (через параметры времени выполнения Java), чтобы я мог печатать на консоли, какой поток приостановлен и какой поток возобновляет его выполнение?Обнаружение того, какой поток Java вторгается в мой метод.

+0

Я бы удостоверился, что gc не возникает в то время, когда вы видите задержку, вы можете добавить '-verbose: gc' в командную строку. –

+0

Привет, у нас была эта строка в наших параметрах загрузки и обеспечила, что GC не работает между –

+0

. Нет смысла обвинять фоновые потоки, когда, очевидно, ваш код регистрации изменяет время. Вместо этого вы должны просто использовать программное обеспечение для профилирования. Кроме того, в чем проблема с вызовом 120 методов? – Holger

ответ

0

Чтобы узнать имя нити, которые называют метод, попробуйте следующее:

public void myMethod(){ 
    String threadName = Thread.currentThread().getName(); 
    System.out.println("Thread name : " + threadName); 
} 
+0

Проблема не в том, как найти имя потока. Здесь мы хотели бы знать, какая нить вторгается в наш поток. –

0

Что я делаю, это есть поток мониторинга, который периодически проверять, что латентный чувствительная задача завершается вовремя. Когда это не так, он печатает трассировку стека потока (и, возможно, любых других интересующих потоков). Это может быть полезно для отслеживания скрытого дрожания задержки.

+0

Проблема в том, что все темы, которые мы догадались, которые могли бы вторгаться в наш процесс, не являются тем, что вторгается. Мы подтвердили это, добавив некоторые журналы в подозрительный поток, пока он возобновляет выполнение. Любая идея, будет ли здесь -Djavaplugin.trace = true полезной? –

+0

С помощью программного обеспечения профилировщика мы обнаружили, что он был связан с VM Thread внутри JVM. Любая идея, что такое VM Thread? –

+1

@RengasamiRamanujam Резьба VM используется для критических операций остановки, таких как GC и стеки. http://blog.jamesdbloom.com/JVMInternals.html Если это очень важно, я бы посмотрел на количество потоков, которые вы используете, и минимизируете их и минимизируете свою скорость распределения, например.создавать меньше мусора. –

0

Отладчик Eclipse IDE может показать, что поток ожидает другого (debugging Java synchronization). Вы должны прекратить выполнение в нужный момент времени, чтобы вы могли видеть, что происходит.

+0

Это не сценарий, когда один поток ждет другого. Здесь один поток принудительно приостанавливает другой поток по какой-то причине. –

+0

Можно попытаться установить условные точки останова в методах, например Thread.suspend, с условием проверки имени потока. – mm759

0

Это ясно показывает некоторые фоновый поток фактически блокирует мое исполнение

Что значит есть и другие темы, которые потребляют все циклы процессора и вызывают задержки в случайном порядке. Вам нужно следить за потреблением процессора в потоках и выяснять причину вины different ways to find the thread CPU usage

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