Introduction
This post will concentrate on optimal ways to improve performance of Java based web application (although this post concentrates on Java based web application same thought process can be applied to web applications developed in other technology stack) without impacting monetary cost.
We will cover the following points from performance point of view.
- Important factors impacting performance of system.
- Patterns of performance issues
- Step by step approach in improving performance of system by keeping same infrastructure, i.e. without impacting cost to project.
Performance improvement activity is not a one time activity, but it is an iterative activity which involves PDCA (Plan, Do, Check, Act)
Factors impacting web application performance.
- Total number of users accessing (logged into) system
- Total number of transactions hitting to the system
- The Total amount of data fetched by the client (both human and other systems)
By looking at above parameters one can easily say the performance of system degrades when any of these parameters increases.
Ways to improve performance of the system is by
- Reducing load on system with the help of distributing load across systems (This approach mostly involves hardware cost and installation of load balancer hence we will not concentrate on this point here, but can be implemented once steps involved in this post are implemented. ).
- Make the system work for the least amount of data to for request received by the client.
Patterns for Performance issues
Whenever a performance issue occurred one can observe any of these patterns.
- Issue specific to single user
- In order to determine RCA for these types of issue one needs to determine if client system has incompatible software installed or some upgradation happened recently.
- An issue occurred only at a specific site/location
- Probable root cause for these types of problems
- Network related issues at that specific location
- Incompatible software installation or some upgradation happened recently.
- Issue observed only for specific functionality.
- One needs to find the issue is specific to code, persistence layer or it is specific to external interface (webservice, JMS) system is communicating.
- Issue observed across all locations during a specific time frame (work hours, month end etc)
- These types of issues are examples of system unable to handle load.
- Issue observed intermittently
- These types of issues are more dangerous and root cause of these types of problems can be observed by taking heap/thread dumps.
Important components in web applications
Majority of web applications will have the following components

Steps to improve the performance of the system.
Although one can improve performance of system by various techniques, but ideal way is to improve performance at client layer then at application code level and at the end at persistence layer.
improve performance from client side —>Application Code—> Persistence layer.
Steps at client side (browser)
These actions are related to working primarily on static content, i.e. Java Script, CSS, Images etc.
Segregate inline JS, CSS to separate JS, CSS file
Many standard browsers have important feature i.e. caching of static content (JS, CSS). Writing inline JS and CSS kills caching feature provided by the browser. Inline static content also involves pain of moving information from host to client for each client request.
This activity is a good example of making the system work on less data.
Following is screenshot for Mozilla browser indicating the amount of data transferred and the time taken in order to complete a request for first time any subsequent calls will not give call to the server but will load from the local cache of browsers.

Replace existing JS, CSS by minified JS.
Minification is activity of removing unwanted data (whitespace, comments) from production ready static content. Few tools also provide a facility for converting big variables into small. This way one can reduce the amount of data to be transferred to client side.
A web application can have both application specific JS, CSS and third party JS, CSS (e.g.. JQuery, Angular JS, Bootstrap…..).
Various famous JS, CSS libraries provide both minified and normal versions (minified version removes all unnecessary white spaces. Replace long identifiers by short).
Following is screenshot indicating the amount of data downloaded and time taken for loading minifed version of angular js.

The total amount of improvement in time (509-78) *100/509 nearly 84%
Total amount of improvement in data (937.81-122.96)*100 /937.81 nearly 86%
Compressing application specific static content
In order to compress application specific static content (JS, CSS) various modification tools available
Few common examples of compressors
- YUI Compressor: – Tool from Yahoo
- JsMin: – from Douglas Crockford, one of the most respected personality in the field Java script.
- Google Closure: -Tool from Google
Remove Http 404 status code
Http 404 status code sent by the http host when requested resource not available to host. These types of requests create unnecessary network round trips.
Following links help in configuring access logs for jboss and Weblogic server.
Configure access logs in Weblogic
Configure access logs in JBOSS
Imp Note: - enabling access log in, the system will increase load on system, hence must be used with caution.
Replace client side pagination/huge table data by server side pagination
Server side pagination help loading page quickly. This technique fetches only required records to be displayed on the view.
Another way to improve page loading time is by forcing users to narrow down searches.
Steps on the server (application/web server) side
Integrate application with the application performance monitoring (APM) tool.
Purpose of integrating these tools is to measure performance of the system in production with minimal load on system. It also helps in determining parameters during load. Although the majority of these tools utilizes java’s bytecode instrumentation, but JAMon provides Aspect oriented programming (AOP).
Important parameters from performance point of view.
- Maximum number of users logged into the system.
- Maximum transactions hitting to the system (determine transaction rate)
- Most frequently hit URLS on the system.
- Slow Running transactions in the system.
- Slow Running SQL queries.
- Most frequently occurred Exceptions.
Following are few important APM tools.

Some other APM tools are New Relic, Compuware Dyna trace. These tools along with AppDynamics present in Gartner’s magic quadrant.
Reduce IO
One can use following techniques for reducing IO.
- Reduce number of logs to file
- Remove System.out.println
- Reduce size of log file :- it is always better to write to small files instead of writing and analyzing huge files
- Avoid catching too many exceptions in the system. Handle it properly. Following code indicates how system will behave for exception and without exception. Various APM tools provide most frequently thrown exceptions and code which is throwing them.
public class ExceptionTest {
private static void exceptionTest(){
int i=0;
int j=1;
try{
int k=j/i;
}catch(ArithmeticException ex){
}
}
private static void withoutExceptionTest(){
int i=0;
int j=1;
if(i>0){
int k=j/i;
}
}
private static void exceptionTestLoop(int iterations,boolean isHandleException){
long startTime=System.nanoTime();
for(int i=0;i<iterations;i++){
if(isHandleException){
exceptionTest();
}else{
withoutExceptionTest();
}
}
long endTime=System.nanoTime();
long time=endTime-startTime;
System.out.println(“time for execution exception “+time+” iterations “+iterations+” isHandleException “+isHandleException);
}
public static void main(String[] args) {
exceptionTestLoop(100000,true);
exceptionTestLoop(100000,false);
}
}

Steps on the DB side.
Although this post concentrate mainly on application code and browser specific side but following are easier techniques on persistence layer.
- Add indexes to columns: – this technique improves performance of Select Queries but reduces DML hence must be used with caution.
- Use run time parameters to SQL queries instead of using hard coded static parameters
- Cache master data instead of fetching it from db
- Archive database on predefined interval
|
Like this:
Like Loading...