Java also eats a lot of RAM in many applications (J2EE apps can easily eat a few GB of RAM), so combined with the multi-second latency for startup, you're basically confined to a single programming model: One giant, long-running, multithreaded program.
We recently went live with a suite of applications (5 apps all together, both web and backend), processing tons of data in "real-time" in multiple threads and after a few days of usage someone noticed it was running with default 512M of RAM (8gb planned).
Considering the load it is processing - it is very impressive. And yes, it is using all of J2EE in WebSphere with mq, hibernate, spring core, spring integration, etc.
BUT I could not make JIRA work with 512 linode, had to upgrade to 1m and later on switch to jira-cloud as it was failing all the time.