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.