JAVA MEMORY LEAK, UTILISATION AND MONITORING USING JFR using Mission Control
Java flight recording(JFR) help us to analyse and find the root cause of any slowness in our program along with CPU usage , hot methods and garbage collection , profiling etc.
To visualise we need to feed .jfr file to JDK mission control present in JDK bin folder.
After successful compilation , we should run the program with below option which will generate the .jfr and feed to mission control.
command : java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=200s,filename=flight.jfr -cp ./out/ path-and-class-name
Below are some example to understand how this JFR can be helpful.
1. Lets consider we have created a java program in which we have used LinkList to store the elements and in same program we are using contains method inside a for loop of 1 million , in this case each time this contains method will be called then 1 million records will be scanned each time which can slow our program.
To overcome this problem we should have consider HashSet instead if linkedList as data are stored in sequential way in LinkedList and using contains method increase the comparing time while in Set its O(1).
This kind of problem will be difficult to analyse from developer eyes as while developing more focus given to business logic compare to data type selection. Here JFR comes to rescue and point at exact method line as hot methods which should be looked into
2. Suppose we have synchronised a method or block used by multiple threads but as we know synchronised block can be accessible by only one thread at a time. JFR can visualise and give you proper graphical representation of waiting , blocking and running time of thread and can point out exact blocking method which is causing issue.
3. Lets consider we created a Hashmap as HashMap<Integer, String> map=new HashMap(). now we are putting key as primitive int and value as a string and we have 1 million records to put. Do you realise any issue here .
No let me tell you, every-time you are calling put method using int as key, internally java is doing autoboxing to change the type of primitive type to Integer type. This can be visualise and can be found when you will run your program with Java mission control and will be able to see the differences after changing the type of key.
Comments
Post a Comment