Not mentioned in all the other answers is a case where kill -9 doesn't work at all, when a process is <defunct> and cannot be killed:
How can I kill a <defunct> process whose parent is init?
What is for a process and why it doesn't get killed?
So before you attempt to kill -9 a <defunct> process run ps -ef to see what his parent is and attempt the -15(TERM) or -2(INT) and lastly -9(KILL) on his parent.
Note: what ps -ef does.