I've read a blog(in Chinese only) in which the author had jeered at Java programmers who know little about C and system programming.The author illustrated how he had found the deep reason of a Java NIO Selector exception using his knownledge of C and Windows/Linux system API. The IOException is thrown with message Unable to establish loopback connection when calling java.nio.channels.Selector.open() too many times. What he had found was that for each opening of Selector, a pair of TCP connections were created in Windows and a pair of pipes were created in Linux. In another blog, he also mentioned that GNU Java compiler was a clever implementation than Sun Java.What he said seems completely new and interesting to me. But I am not sure if C/system knowledge is the only way to figure out such problems quickly. Is it really worth spending much time on learning those knowledges for Java programmers?  
Is it necessary for Java programmers to learn some C/System programming?
java;c
I would say yes, quite emphatically in fact.  I wish there was some way to ensure that anyone without knowledge of system programming, including at least a passing familiarity with assembly, would never get anywhere near the source for any serious project.Why?  Because I don't just write computer programs; I also use them, and a lot of the ones I use are crap because they were written by people who didn't know what they were doing.  There are a lot of important issues in computer programming that simply don't make any sense without a knowledge of how things work at the bits-and-bytes level, and the less incompetent coders out there cluelessly writing bad code, the better the experience will be for all of us.