I list many performance tips for servlets and JSPs at http://www.JavaPerformanceTuning.com/tips/j2ee_srvlt.shtml. Here's a summary of tips we haven't covered yet.
Security checks consume CPU resources. You will get better performance if you can turn security checking off.
Try to optimize the servlet-loading mechanism (for example, by listing the servlet first in loading configurations).
Avoid reverse DNS lookups (e.g., ServletRequest.getRemoteHost( )). These lookups take significant time and block the thread. Instead, log the raw IP addresses and use a separate process to execute reverse DNS lookups to supplement the logs.
Precompile your JSPs to avoid giving the first user a slow experience. Either run the page once before making it public (which compiles it), or use the application server's features to precompile the servlet.
The Servlet 2.3 specification adds application and session events. Event-driven applications can often be scaled more easily than process-driven applications. Try to make your servlet event-driven.
Servlet filters provide a standardized technique for wrapping servlet calls. However, they have some overhead, which translates to a reduction in performance.
Separate the UI controller logic from the servlet business logic, and let the controllers be mobile so they can execute on the client, if possible.
Validate data as close to the data-entry point as possible, preferably on the client. This reduces the network and server load. Business workflow rules should be on the server (or further back than the frontend). You could use invisible applets in a browser to validate data on the client, but the extra time required to download the applet may make this unusable.
HTTP 1.1's Keep-Alive feature gives a higher throughput for static sites, but may be extra overhead for dynamic sites.
Increase server listen queues for high-load or high-latency servers. The listen queue is a TCP/IP-level queue for incoming socket accepts and is set with the second argument to the ServerSocket constructor (if you are explicitly creating a server socket). The application server must expose the parameter as a configuration option for you to adjust this.
Disable the JSP auto-reloading feature. Auto-reloading is a development feature of many application servers that repeatedly reloads servlets and JSPs. Turn this feature off for performance tests and deployed systems.
Tune pools in the application server (see Chapter 18 for details).
Transform your data to minimize the costs of searching it. If your dataset is small enough, read it all into memory or use an in-memory database (keeping the primary copy on disk for recovery). An in-memory database avoids overhead in several ways: it eliminates passing data in from a separate process, reduces memory allocation by avoiding data copies as it passes between processes and layers, eliminates the need for data conversion, and enables fine-tuned sorting and filtering.
Precalculation expedites some results by making the database data more efficient to access (by ordering it in advance, for example), or by setting up extra data in advance, generated from the main data, to simplify result calculations.
String optimizations tend to be significant in servlets. See Chapter 5 for standard String optimizations.