under the hood
Personally, I can't stand language changes. The language should be a simple as possible, certainly no more complicated than it is already.
API changes are somewhat better, want an API for everythign under the sun, fine.
Now lets talk about under the hood. Here are a few things I'd like to see.
1) Escape analysis. Use escape analysis to stack allocate unescaping objects and eleminate contention on them.
2) Object inlining. Use object inlining to combine a wholly contained object into its container.
3) Class cast elimination, this is closely related to generics. The javac can tag a class with additional information stating the type of the generic, or the VM can try to infer it at runtime, not sure which way is better. In either case, try to eliminate as many casts as possible.
4) Full use of auto-vectoring. The VM needs to fully utilize the vector units available in modern processors. This is difficult to do, but it would give java a performance advantage that is VERY difficult to achieve with native code. (Raise your hand if you think MS Word can use your SSE units, but of course netbeans would be able to just by virtue of being java.).
5) Isolation API. The VMs should share all executable code, including loaded bytecode and compiled bytecode, but not share static variables. This is already about halfway done with 1.5, and just needs to be finished.
If these things were done, they would have a few impacts.
1) Substantially increased performance, perhaps 10-20% or more across the board.
2) Decreased memory footprint. Sharing more data and cleaning up memory more efficiently (including having fewer object headers due to inlining) would help the memory footprint, especially when multiple VMs are running.
3) Increase scalability. Being able to stack allocate, and inline would allow the GC to manage fewer objects and reduce the need for "stop the world" garbage collections that quickly become a bottleneck with multiple GB of ram on multi processor systems.