Отслеживание IO в Java-приложении? - PullRequest
4 голосов
/ 15 января 2009

Я пытаюсь выяснить, почему Apache CXF убегает, делая «что-то» при первоначальной инициализации веб-службы. «Something» - это, вероятно, какой-то ввод-вывод, и я предполагаю, что он пытается разрешить какой-то внешний адрес / схему / DTD.

Так что я пытаюсь найти какой-то хук, где я могу контролировать все операции ввода-вывода. Либо на уровне виртуальной машины, либо на уровне операционной системы (я могу работать как на Linux, так и на Windows, но мне не разрешено запускать wireshark, и есть теоретическая возможность, что это может быть файл IO).

Любые предложения о том, как я могу отследить, что происходит?

Ответы [ 5 ]

4 голосов
/ 15 января 2009

Один из способов узнать, что происходит, - запустить 'strace' или 'ltrace' в процессе apache. Краткое введение к этому здесь . Интересно, что strace должен блокировать определенный вызов, то есть ожидать ввода-вывода, если ваша гипотеза верна.

Чтобы проверить, какие файлы (и сетевые сокеты) использует определенный процесс, посмотрите на 'lsof'. Например, чтобы проверить, какие файлы открываются определенным процессом:

lsof -p process_id  # by PID
lsof -c httpd       # by a process name

Чтобы проверить сетевые соединения в целом, попробуйте 'netstat'

2 голосов
/ 20 января 2009

Скорее всего, он занят разрешением WSDL, его разбором, обработкой и т. Д ....

На самом деле, впервые, он также обрабатывает все конфигурационные файлы Spring, что включает в себя загрузку схем для них, а также проверку и прочее.

Вы МОЖЕТЕ также запустить что-то вроде wireshark для отслеживания всего сетевого трафика, чтобы увидеть, собирается ли он получить что-либо.

2 голосов
/ 15 января 2009

В дополнение к strace и filemon, которые контролируют приложение с уровня ОС, вы также можете попробовать интерактивный профилировщик. Такой инструмент, как бесплатный VisualVM от Sun, может показать вам, как часто вызываются различные методы, а также простой способ создания и просмотра дампов потоков. Таким образом, вы можете увидеть, вращается ли приложение в вашем собственном коде, или поток блокирует ожидание некоторого ввода-вывода, который никогда не завершается.

2 голосов
/ 15 января 2009

В Windows вы можете использовать filemon , он перечислит все обращения к файлам и позволит отфильтровать их, чтобы вы могли видеть только те процессы, которые вас интересуют.

Похоже на более новые версии Windows Process Monitor - это путь вперед.

1 голос
/ 20 июня 2011

Вы можете отслеживать свое приложение на уровне JVM, используя InTrace . Это позволит вам определить, какой код Java выполнялся во время запуска. При этом используется агент Java для добавления инструментария к классам по мере их загрузки, что позволяет генерировать вызовы входа / выхода метода для всех используемых классов.

...