2013-04-29 2 views
26

Я только что установил Unnecessary Code Detector для Eclipse и запустил его в своем проекте. Я вижу много так называемого «мертвого кода». Хотя, с организационной точки зрения, это имеет смысл, чтобы удалить мертвый/ненужный код, это заставило меня задуматься:«Мертвый» код мешает работе приложения Java?

Does мертвого код фактически препятствуют производительностям Java, приложение?!?!

Для меня, если код действительно «мертв», он никогда не запускается, поэтому я не вижу, как его удаление (опять же, за исключением операций по организации/уборке/очистке кода) может когда-либо повысить производительность.

+3

Если вы делаете какое-либо отражение, это может замедлить это. – Pace

+0

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

+1

Короткий ответ, да. Но производительность - это совершенно другое животное, которое нужно атаковать по-другому. – Siddharth

ответ

21

Это может повлиять на несколько вещей ...

  • Размер приложения
  • памяти используется, когда приложение работает
  • снижение производительности на сканирование пакета (если это применимо)
+0

Спасибо @Webnet (+1) - одна вещь, которую я до сих пор не понимаю, - это то, почему мертвый код будет запускать кучную память при запуске приложения. Можете ли вы немного разобраться? Еще раз спасибо! – 2013-04-29 14:50:26

+2

@TicketMonster - Я считаю, что запущенному приложению нужно хранить «индекс» сортировки для объектов, поэтому, когда они импортируются, они знают, что они там и где их найти. В то время как размер отпечатка небольшой, в зависимости от того, сколько у вас «мертвого кода», оно может складываться. – Webnet

+0

Еще раз спасибо @Webnet (+1 еще раз) - можете ли вы указать мне что-нибудь конкретное в документации JVM (или где-нибудь еще), чтобы следить за этим? – 2013-04-29 17:40:31

30

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

Где возможно компилятор JIT может удалить этот мертвый код - см. dead-code elimination. Я полагаю в теории, если компилятор JIT удалил огромный количество мертвого кода, это могло повлиять на начальный сборник.

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

+1

У меня нет возражений против «затруднения разработки», но есть ли у вас что-нибудь, чтобы создать резервную копию «Не думаю, что« мертвый код »будет препятствовать применению performance'? – nhahtdh

+1

Если компилятор JIT удаляет его, я не вижу в этом проблемы. –

+0

Однако я убедился, что сказал «думаю», потому что я предпочел бы сам проверить его, чтобы убедиться, что он не замедляет работу кода. –

1

Это может повлиять на производительность вашего приложения.

Редактировать

Один из способов смотреть на это; мертвый код добавит дополнительную память в текущее приложение. Это также скажется на производительности приложений.

+3

Если код никогда не запускается, он не будет использовать кучную память, только PermGen (для хранения скомпилированного кода) –

+0

согласен .. я просто подпрыгнул пистолет. Спасибо за исправление. обновили мой ответ. –

+0

Спасибо @ rai.skumar (+1) - так что весь скомпилированный код хранится в PermGen? Как насчет кэша кода? – 2013-04-29 14:51:28

4

Это может повлиять на это немного, но компилятор JIT должен иметь возможность обнаруживать и исключать методы, которые никогда не используются. И даже если это не так, накладные расходы (память, время загрузки, время компиляции JIT и т. Д.), Вероятно, будут небольшими.

Лучшей причиной для устранения мертвых методов является избавление от «старого материала», что делает вашу кодовую базу сложнее читать, тестировать, поддерживать. Если это код, который вам может понадобиться снова, вы всегда можете вернуть его из управления версиями.


Что делать, если спросить у пользователя, какой метод вы хотите позвонить? , возьмите ввод как String, а затем вызовите этот метод, используя отражение ?. JIT не может сказать, какой метод будет использоваться, поэтому он не может удалить какие-либо методы :).

Хорошая точка. Поэтому на практике это, вероятно, не устранит. (Но это могло бы ... если classloader знал, где перезагрузить метод из ...)

Мертвые методы увеличивают площадь метода в JVM.

Да, хотя процентное увеличение памяти, вероятно, невелико. И, следовательно, снижение производительности, вероятно, еще менее значимо.

Также метод, который никогда не вызывается, никогда не будет скомпилирован JIT, поэтому вы, вероятно, не будете использовать 50% или более использования памяти для обычного метода live.

Так слишком много мертвого кода может привести к выгрузке классов из области метода (кучи), которая может повлиять на производительность приложения. я прав?.

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

+0

* Компилятор JIT должен иметь возможность обнаруживать и устранять методы * - Что делать, если я спрашиваю пользователя *, какой метод вы хотите вызвать? *, Возьмите ввод как строку и затем вызовите этот метод с использованием отражения ?. JIT не может сказать, какой метод будет использоваться, поэтому он не может удалить какие-либо методы :). Мертвые методы увеличивают область методов в JVM. Поэтому слишком много мертвого кода может привести к выгрузке классов из области метода (кучи), что может повлиять на производительность приложения. я прав?. PS: Приносим извинения за * попытку ответа * и * задание вопроса * в одно и то же время. :( – TheLostMind

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