Инструменты покрытия кода, такие как Emma, Cobertura и Clover, будут инструментировать ваш код и записывать, какие его части вызываются при выполнении набора тестов. Это очень полезно и должно быть неотъемлемой частью вашего процесса разработки. Это поможет вам определить, насколько хорошо ваш набор тестов покрывает ваш код.
Однако это не то же самое, что идентификация реального мертвого кода. Он только идентифицирует код, который покрывается (или не покрывается) тестами. Это может дать вам ложные срабатывания (если ваши тесты не охватывают все сценарии), а также ложные отрицания (если ваши тесты обращаются к коду, который фактически никогда не используется в сценарии реального мира).
Я полагаю, что наилучшим способом действительно идентифицировать мертвый код было бы снабдить ваш код инструментом покрытия в действующей среде и проанализировать покрытие кода в течение длительного периода времени.
Если вы работаете в избыточной среде с балансировкой нагрузки (а если нет, то почему бы и нет?), То я полагаю, что имеет смысл использовать только один экземпляр приложения и настроить балансировщик нагрузки так, чтобы случайная, но небольшая часть ваши пользователи работают на вашем инструментальном экземпляре. Если вы делаете это в течение длительного периода времени (чтобы убедиться, что вы охватили все реальные сценарии использования - такие сезонные изменения), вы должны быть в состоянии точно определить, к каким областям вашего кода обращаются при реальном использовании и какие части действительно никогда не доступны и, следовательно, мертвый код.
Я никогда лично не видел, чтобы это было сделано, и не знаю, как вышеупомянутые инструменты могут быть использованы для инструментов и анализа кода, который не вызывается через набор тестов - но я уверен, что они могут быть.