Olivier Le Moal - Fotolia
In Java, you have to remember that the JVM is an engine and not a form of cloud or distributed virtualization. Think of the JVM as a single server, and the applications as parallel tasks or programs. They all share server resources, and that means they compete for them. Don't neglect distribution of functionality in Java!
Observation is also helpful in pinning down specific technical issues. In Java, for example, a common issue in application performance is inefficient garbage collection (GC). GC problems cause distinct hiccups in the progression of applications at the point where GC takes place, as opposed to a general slowdown.
Monitoring application performance
All of this, users report, can be for nothing if you don't take care to sustain performance during application changes. Most companies are moving to continuous development and deployment, and many who do so are failing to provide adequate performance testing at scale. Developers know that the place where problems most commonly arise is in a change cycle, where time pressure and a focus on features can override awareness of performance issues. Don't let that happen.
An easy way to ensure that performance problems aren't introduced in a change cycle is to do a final at-scale test of a new application version and compare the results against the original version. Any noticeable performance difference should be addressed before the application is released to production. Another good idea is to do specific application performance monitoring during the first week of operation of a new application, just in case at-scale testing doesn't really replicate full production workloads.
Almost all high-level languages are less efficient than lower-level ones. For components of applications that will be exposed to very high workloads or that have to generate very short control loops, it may be advisable to "escape" into another language for development of these components. In many cases, this will resolve performance issues for the application at large, even if only one or two components are changed. The right answer is the one that works, not the one that's easiest!