Как правило, если ваш статический метод не использует какого-либо состояния (т.е. читает и записывает в статические поля и свойства или вызывает другие статические методы, которые делают это), побочных эффектов для вызывающей стороны не будет, нетнезависимо от того, сколько потоков они запускают.
Если вы запрашиваете наилучшую практику, статические методы, как правило, плохая идея.Если вообще, статические методы должны использоваться только для очень общих функциональных возможностей утилиты.
Это не рекомендуется, потому что вы не можете предсказать, изменятся ли требования, и вам нужно какое-то состояние в один день.Тогда вам лучше использовать класс, который может создать экземпляр вызывающей стороны, и разбить весь существующий код, который использует вашу функцию.
О сборке мусора, да, конечно, есть некоторые издержки, но в настоящее время это жертваесли вы идете по маршруту управляемой памятью ОО.Если вы хотите больше контроля, используйте небезопасный код или язык, такой как C ++ или Vala.