The first and the most important one is that Java has failed to provide a dependable incremental garbage collection mechanism upon now. There have been some major improvements quite recently (thank to BEA) in providing parallel incremental GC but we are not where we are supposed to be yet. This looks a minimal issue at the first glance but becomes a real pain when system has to answer thousand of request per second and still remain compliant to its SLA.
reply: Agree. Also until recently 64 bit heap of 10s of gigabytes were effectively unusable because jvm managed it in an inefficient way, so if you had a heap of 10gb jvm would use 20gb because of 64 bit pointers. Thankfully that's fixed in java6. Parallel GC is also a lot more usable now.
- According to me, the second major issue is the lack of tail-recursion detection in JVM. As you know, mission-critical system are not proved by mere unit testing; they are proved by mathematics. This is where lambda-calculus and functional programming paradigms apply. Again Java's deficiencies in providing functional infrastructure makes in unreliable for most critical systems.
reply: Agree. And you can fix this problem, to some extent, by simulating functional style of design and code.
- No build-in support for actor model concurrency, hence unable to get the most of today's highly concurrent multi-core world. Thanks to community works such as Scala and Kilim, at least we have a something similar to actor-model but JVM has to support this itself.
Moreover there issues such as; lack of hot-swap, weak light/green- threads (aka fiber), generics erasers (to be fixed in Java 7), and weak DBC support.
reply: Imho one of the main issues has always been and still is too many levels and layers upon each other until you reach the host system's functionality. Transactions, statements and all sorts of other things have to go through too many layers.
Please note that no language can be strong in every fields. A friend of everybody is a friend of nobody. I myself use and praise Java, but this does not prevent me from seeing the rest of the world and close my eyes to weaknesses.
Our team did a survey for one of the banks regarding development platform, and eventually we concluded that Java is used more and more each day in banking field like many others domains. In recent ten years Java has been the first choice in banking field and even it is used in core banking. I know for example that BoA had a great success in evaluating Java is a cluster running more than 2000 machines and in fact Java did it quite successfully. And we all know VOCA which (is not a bank but) does finance using Java across Europe.
reply: Note that existing systems follow traditional paradigms. New paradigms such as Grid/Cloud open new doors to us and they let us to even use java deficiencies in these new paradigms to our advantage!