Java applications require a virtual machine to run because they cannot be compiled to machine language (native code) for many processors, instead Java is usually complied into bytecode. Java is also a very high-level Object-Oriented programming language (OOP) which means that while the application code itself is much easier to maintain, the objects that are instantiated will use that much more memory.
There are a number of other reasons why. For example, most modern applications use the UTF-8 charset for strings (usually text) as it can support so many other languages symbols. And since so many applications target a huge international market, they're sorta obligated to use it.