In general, defunct processes are caused by a parent process not
reaping its children. Find out which process is the parent
process of all those zombies (ps -e). It's that process that
has a bug.
In Solaris 2.3 (and presumably earlier) there is a bug in the
pseudo tty modules that makes them hang in close. This causes
processes to hang forever while exiting.
Fix: Apply patch 101415-02 (for 2.3).
In all Solaris 2 releases prior to 2.5 (also fixed in the latest
2.4 kernel jumbo patch), init (process 1) calls sync() every five
minutes which can hang init for some considerable time. This can
cause a lot of zombies accumulating with process 1 as parent, but
occurs only in rare circumstances.