A heap dump is required in Java to troubleshoot memory-related issues in Java applications. It is a snapshot of all the objects that are in memory in the JVM at a certain moment. This snapshot can be analyzed to identify objects that are no longer needed, or that are causing memory leaks.
Fetching pid of java applications: To fetch the pid, we can use jps command in the terminal which will provide list of java applications running along with their pid and other details.
The various methods to generate the heap dump of an application is as follows:
Using jmap
jmap is packaged with the JDK and extracts a heap dump to a specified file location. To generate the heapdump using jmap, we need the pid of our application. We can fetch the same using above mentioned method. Sample command to generate the heap dump is given below
Here
Actuator library in spring boot application
The spring actuator can also be used to fetch the heap dump at runtime which is a binary file and can be analysed in specific tools.
The actuator dependency expose certain endpoint of the application which can be used to analyse the application at runtime. To fetch the heap dump, we can hit an GET request and store the response in file with hprof extension.
For OutOfMemoryError scenerio in application
This option is used to capture a heap dump at the point in time when an
References:
baeldung.com/java-heap-dump-capturehttps://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#heapdump
https://reflectoring.io/create-analyze-heapdump/
Fetching pid of java applications: To fetch the pid, we can use jps command in the terminal which will provide list of java applications running along with their pid and other details.
The various methods to generate the heap dump of an application is as follows:
Using jmap
jmap is packaged with the JDK and extracts a heap dump to a specified file location. To generate the heapdump using jmap, we need the pid of our application. We can fetch the same using above mentioned method. Sample command to generate the heap dump is given below
jmap -dump:live,file=mydump.hprof <pid>Here
-dump means that we want to generate the dump. The option live is used to collect only the live objects that still have a reference in the running code. With the live option, a full GC is triggered to sweep away unreachable objects and then dump only the live objects. The option file take the file path where we wants to store the the dump, by default the path is same as where application is running. The dump generated is in binary and is stored in hprof files to be analysed later in suitable tools like EAT, etc.Actuator library in spring boot application
The spring actuator can also be used to fetch the heap dump at runtime which is a binary file and can be analysed in specific tools.
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>The actuator dependency expose certain endpoint of the application which can be used to analyse the application at runtime. To fetch the heap dump, we can hit an GET request and store the response in file with hprof extension.
For OutOfMemoryError scenerio in application
This option is used to capture a heap dump at the point in time when an
OutOfMemoryError occurred. This helps to diagnose the problem because we can see what objects were sitting in memory and what percentage of memory they were occupying right at the time of the OutOfMemoryError. java -jar CreateCase-0.0.1-SNAPSHOT.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<File path>hdump.hprofReferences:
baeldung.com/java-heap-dump-capturehttps://docs.spring.io/spring-boot/docs/current/actuator-api/htmlsingle/#heapdump
https://reflectoring.io/create-analyze-heapdump/
Baeldung on Kotlin
Different Ways to Capture Java Heap Dumps | Baeldung
Learn multiple ways to capture a heap dump in Java
> Creational
>>Factory
>>>Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
>>Abstract Factory
>>>Abstract Factory is a creational design pattern that lets you produce families of related objects without specifying their concrete classes.
>>Builder
>>>Builder is a creational design pattern that lets you construct complex objects step by step. The pattern allows you to produce different types and representations of an object using the same construction code.
>>Prototype
>>>Prototype is a creational design pattern that lets you copy existing objects without making your code dependent on their classes.
>>Singleton
>>>Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.
>Structural
>>Adapter
>>>Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.
>>Bridge
>>>Bridge is a structural design pattern that lets you split a large class or a set of closely related classes into two separate hierarchies—abstraction and implementation—which can be developed independently of each other.
>>Composite (Object Tree)
>>>Composite is a structural design pattern that lets you compose objects into tree structures and then work with these structures as if they were individual objects.
>>Decorator (Wrapper)
>>>Decorator is a structural design pattern that lets you attach new behaviors to objects by placing these objects inside special wrapper objects that contain the behaviors.
>>Facade
>>>Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes.
>>Flyweight (Cache)
>>>Flyweight is a structural design pattern that lets you fit more objects into the available amount of RAM by sharing common parts of state between multiple objects instead of keeping all of the data in each object.
>>Proxy
>>>Proxy is a structural design pattern that lets you provide a substitute or placeholder for another object. A proxy controls access to the original object, allowing you to perform something either before or after the request gets through to the original object.
>Behavourial
>>Chain of Responsibilities(CoR, Chain of Command)
>>>Chain of Responsibility is a behavioral design pattern that lets you pass requests along a chain of handlers. Upon receiving a request, each handler decides either to process the request or to pass it to the next handler in the chain.
>>Command (Action/ Transaction)
>>>Command is a behavioral design pattern that turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
>>Iterator
>>>Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation (list, stack, tree, etc.).
>>Mediator (Intermediary / Controller)
>>>Mediator is a behavioral design pattern that lets you reduce chaotic dependencies between objects. The pattern restricts direct communications between the objects and forces them to collaborate only via a mediator object.
>>Momento (Snapshot)
>>>Memento is a behavioral design pattern that lets you save and restore the previous state of an object without revealing the details of its implementation.
>>Factory
>>>Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
>>Abstract Factory
>>>Abstract Factory is a creational design pattern that lets you produce families of related objects without specifying their concrete classes.
>>Builder
>>>Builder is a creational design pattern that lets you construct complex objects step by step. The pattern allows you to produce different types and representations of an object using the same construction code.
>>Prototype
>>>Prototype is a creational design pattern that lets you copy existing objects without making your code dependent on their classes.
>>Singleton
>>>Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.
>Structural
>>Adapter
>>>Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.
>>Bridge
>>>Bridge is a structural design pattern that lets you split a large class or a set of closely related classes into two separate hierarchies—abstraction and implementation—which can be developed independently of each other.
>>Composite (Object Tree)
>>>Composite is a structural design pattern that lets you compose objects into tree structures and then work with these structures as if they were individual objects.
>>Decorator (Wrapper)
>>>Decorator is a structural design pattern that lets you attach new behaviors to objects by placing these objects inside special wrapper objects that contain the behaviors.
>>Facade
>>>Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes.
>>Flyweight (Cache)
>>>Flyweight is a structural design pattern that lets you fit more objects into the available amount of RAM by sharing common parts of state between multiple objects instead of keeping all of the data in each object.
>>Proxy
>>>Proxy is a structural design pattern that lets you provide a substitute or placeholder for another object. A proxy controls access to the original object, allowing you to perform something either before or after the request gets through to the original object.
>Behavourial
>>Chain of Responsibilities(CoR, Chain of Command)
>>>Chain of Responsibility is a behavioral design pattern that lets you pass requests along a chain of handlers. Upon receiving a request, each handler decides either to process the request or to pass it to the next handler in the chain.
>>Command (Action/ Transaction)
>>>Command is a behavioral design pattern that turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
>>Iterator
>>>Iterator is a behavioral design pattern that lets you traverse elements of a collection without exposing its underlying representation (list, stack, tree, etc.).
>>Mediator (Intermediary / Controller)
>>>Mediator is a behavioral design pattern that lets you reduce chaotic dependencies between objects. The pattern restricts direct communications between the objects and forces them to collaborate only via a mediator object.
>>Momento (Snapshot)
>>>Memento is a behavioral design pattern that lets you save and restore the previous state of an object without revealing the details of its implementation.