As JIT compilers improve in quality and become generally available, this way of using Java will improve but will always lie some factor of two in performance lower than conventional compiled code. However, native Java compilers can also be built. Note that Java lacks pointers and operator overloading and this aids compiler optimization. Zoran Budimlic from the Fortran Parallel Programming Systems group at Rice pointed out in his presentation that the complex user-defined exception handlers allowed by Java prevent several important optimizations, and their use would need to be restricted in performance to critical parts of compiled Java code. Java can be an important simulation language in both parallel and sequential environments.
Applications exhibit many forms of parallelism.
Java and its associated Web infrastructure naturally support thread-based concurrency built into the language. This is perhaps not suitable for large-scale data parallelism but can be used for overlap of communication and computation and similar functional parallelism. The Java applet mechanism supports object parallelism as seen in event-driven simulation, while coarser grain metacomputing can be addressed by emerging commercial concepts such as JavaBeans. Java probably has superior support in these aspects of concurrency to other languages. Of course, much parallel computing uses message passing, and here Java has excellent intrinsic support.