Despite the language support, however, synchronization occurs at a fairly low level. C typically requires underlying support from an operating system for proper support of synchronization, at least in a true multithreaded environment. Loadable Classes Java permits classes to be loaded by name at runtime, and methods called by name after loading, both operations largely alien to the C programming model. A simple class loader can simply fail, and still meet the technical requirements of the Java language. You can also add a JVM interpreter to the C runtime, to provide true class loading, but at considerable cost in complexity and final program size.
Loadable classes are probably more of interest to programmers writing Web applets, however.
Objects are allocated and freed quite often in a typical Java program, particularly compared to a typical C program. Java requires garbage collection, in some ways, so it's hard to avoid all the associated overheads. Worst-case behavior should never be worse than interpreted Java, however, and usually much better. A smart JTC translator can retain only those methods actually called in a given Java program. You can play tricks with the package loading rules to get much of the effect of predefined libraries, or separately compiled components.