Java is severely crippled; the worst of this being the lack of operator overloads to make code that deals with math look like math.
C# is the result of M$ tampering with java and losing a lawsuit. It was a windows only language and while there are some efforts to get it working off windows, it was designed to work on windows and is not yet truly a good choice for portability. It fixes some of the problems that java has, though. I personally feel that it is very close to being as good as c++ at most things.
C++'s type system is more powerful, on account of templates. On the other hand, C++'s lack of reflection makes it more difficult to write certain kinds of code, such as serialization.
While tracing garbage collectors are helpful when dealing with certain data structures (e.g. when implementing arbitrary graph slicing), in most programs they're actually a hindrance. A tracing garbage collector implies non-deterministic object destruction, which is incompatible with what is IMO C++'s most powerful feature: RAII. RAII lets you tie resource management to program structure, making manual management mostly unnecessary.