I'll give you the capsule synopsis, the one-sentence summary of the learnings I had from the Bad Thing that happened to me while writing my game in Java: if you begin with the assumption that you need to shrink your code base, you will eventually be forced to conclude that you cannot continue to use Java. Conversely, if you begin with the assumption that you must use Java, then you will eventually be forced to conclude that you will have millions of lines of code.
Very few people write in assembly language today, at least not entire applications. We've all since moved up the stack of abstraction to using C, or one step above that into Perl, Python, Java, etc. The answer is to keep moving up the stack to higher levels of abstractions, such as 'channels'. In a way I wish that Moore's Law would grind to a halt and we could get back to doing computer science.
Update: For a more concrete explanation of what Steve is talking about with code compression and how it relates to Java and other dynamic languages look at these slides on Design Patterns in Dynamic Programming by Peter Norvig. He starts with the GoF Design Patterns and shows that 16 of the 23 are either invisible or simpler in a dynamic language.