{"id":26565,"date":"2023-07-24T08:30:28","date_gmt":"2023-07-24T06:30:28","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=26565"},"modified":"2024-09-11T10:18:28","modified_gmt":"2024-09-11T08:18:28","slug":"my-jvm-memory-analyzes-toolkit","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/","title":{"rendered":"My JVM Memory Analyzes Toolkit"},"content":{"rendered":"\n<p>One of the most common errors while running an application is &#8220;out of memory&#8221;. And Java is no different besides errors being named exceptions. The exact exception name you might have encountered is:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava.lang.OutOfMemoryError\n<\/pre><\/div>\n\n\n<p>And, in most cases, it is related to Java heap.<\/p>\n\n\n\n<p>I will go through a few reminders on what Java heap is. How it works and how to monitor it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Definitions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-java-heap\">Java Heap<\/h3>\n\n\n\n<p>The Java heap stores all objects created by the application. To optimize garbage collection (more info about that in next chapter), JVM heap is divided in multiple zones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Young zone:\n<ul class=\"wp-block-list\">\n<li>Eden: Where new objects are created.<\/li>\n\n\n\n<li>Survivor0 and 1: Where objects are moved if they survive one GC.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Old zone: If objects survive multiple GC, they will end in that zone. The amount of time before an object is moved into that zone depends on GC implementation.<\/li>\n<\/ul>\n\n\n\n<p>When it is not possible to modify JVM startup arguments (because it requires a restart), <code>jstat<\/code> command could provide some information on zones usage and capacities.<\/p>\n\n\n\n<p>An example of jstat command is:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\njstat -gc &lt;PID&gt; 5000\n<\/pre><\/div>\n\n\n<p>where &lt;PID&gt; is the JVM process ID and 5000 is the period for getting metrics in milliseconds.<\/p>\n\n\n\n<p>Output example:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT\n 0.0   6144.0  0.0   6144.0 452608.0 43008.0   589824.0   68717.5   130560.0 117893.6 19456.0 14979.1     18    1.758   0      0.000   0      0.000    1.758\n 0.0   6144.0  0.0   6144.0 452608.0 44032.0   589824.0   68717.5   130560.0 117893.6 19456.0 14979.1     18    1.758   0      0.000   0      0.000    1.758\n 0.0   6144.0  0.0   6144.0 452608.0 45056.0   589824.0   68717.5   130560.0 117893.6 19456.0 14979.1     18    1.758   0      0.000   0      0.000    1.758\n 0.0   6144.0  0.0   6144.0 452608.0 46080.0   589824.0   68717.5   130560.0 117893.6 19456.0 14979.1     18    1.758   0      0.000   0      0.000    1.758\n<\/pre><\/div>\n\n\n<p>As it does not tell when metrics where gathered, it might be useful to use a command like <a href=\"http:\/\/joeyh.name\/code\/moreutils\/\" target=\"_blank\" rel=\"noreferrer noopener\">ts<\/a> to prepend each line with a timestamp.<\/p>\n\n\n\n<p>Additionally, output also provides information about garbage collection like counts and timings. I will go on that in more detail in next chapter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Garbage Collection<\/h3>\n\n\n\n<p>As memory is not unlimited, there is a mechanism to remove useless objects: Garbage Collection. This is an automatic process and programmers do not need to worry about it.<\/p>\n\n\n\n<p>It is phased in two steps (even more for more complex GC algorithms):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>first, identification of objects that can be deleted.<\/li>\n\n\n\n<li>second, actual deletion of objects identified at step 1<\/li>\n<\/ol>\n\n\n\n<p>To avoid going through all objects in memory on each GC, there are two types of GC depending on the zone being worked on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Normal GC (aka Young GC)<\/li>\n\n\n\n<li>Full GC<\/li>\n<\/ul>\n\n\n\n<p>There are also multiple garbage collection strategies which are aimed to have, for example, shortest pause or lowest memory usage. Currently, G1 (Garbage-First) is the default, and recommended, collector strategy for server JVM. It benefits from multiprocessors to decrease pause times and increase throughput. The algorithm is also much more complex than the two-phased approach described earlier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Toolbox<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">For jmap<\/h3>\n\n\n\n<p>The first tool is Excel which is enough to plot <code>jmap -gc<\/code> results.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GC Logs<\/h3>\n\n\n\n<p>To have a more detailed view on how GC behave, additional arguments must be added to the JVM. It will be different on older Java releases (before Java 11).<\/p>\n\n\n\n<p>-verbose:gc<\/p>\n\n\n\n<p>This parameter implies other parameters related to log file storage for location (-Xlog:gc), file rotation (-XX:+UseGCLogFileRotation), number of files to keep (-XX:NumberOfGCLogFiles), files size limit (-XX:GCLogFileSize), etc.<\/p>\n\n\n\n<p>A typical GC log will look like this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;0.929s]&#x5B;info]&#x5B;gc] Using G1\n&#x5B;1.625s]&#x5B;info]&#x5B;gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 31M-&amp;gt;26M(512M) 37.499ms\n&#x5B;1.731s]&#x5B;info]&#x5B;gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 52M-&amp;gt;52M(512M) 44.428ms\n&#x5B;1.845s]&#x5B;info]&#x5B;gc] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 73M-&amp;gt;74M(512M) 50.657ms\n&#x5B;1.987s]&#x5B;info]&#x5B;gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 104M-&amp;gt;104M(512M) 53.909ms\n&#x5B;2.069s]&#x5B;info]&#x5B;gc] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 125M-&amp;gt;125M(512M) 46.043ms\n&#x5B;2.166s]&#x5B;info]&#x5B;gc] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 146M-&amp;gt;146M(512M) 67.730ms\n&#x5B;2.447s]&#x5B;info]&#x5B;gc] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 184M-&amp;gt;185M(512M) 110.586ms\n&#x5B;2.589s]&#x5B;info]&#x5B;gc] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 206M-&amp;gt;206M(512M) 68.388ms\n&#x5B;2.720s]&#x5B;info]&#x5B;gc] GC(8) Pause Young (Normal) (G1 Evacuation Pause) 227M-&amp;gt;228M(512M) 64.378ms\n&#x5B;2.876s]&#x5B;info]&#x5B;gc] GC(9) Pause Young (Normal) (G1 Evacuation Pause) 249M-&amp;gt;249M(512M) 67.766ms\n&#x5B;3.022s]&#x5B;info]&#x5B;gc] GC(10) Pause Young (Concurrent Start) (G1 Evacuation Pause) 270M-&amp;gt;271M(512M) 65.774ms\n&#x5B;3.022s]&#x5B;info]&#x5B;gc] GC(11) Concurrent Cycle\n&#x5B;3.267s]&#x5B;info]&#x5B;gc] GC(12) Pause Young (Normal) (G1 Evacuation Pause) 292M-&amp;gt;292M(512M) 64.186ms\n&#x5B;3.391s]&#x5B;info]&#x5B;gc] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 313M-&amp;gt;314M(512M) 75.695ms\n&#x5B;3.976s]&#x5B;info]&#x5B;gc] GC(14) Pause Full (System.gc()) 319M-&amp;gt;292M(512M) 510.607ms\n&#x5B;3.977s]&#x5B;info]&#x5B;gc] GC(11) Concurrent Cycle 954.886ms\n&#x5B;4.101s]&#x5B;info]&#x5B;gc] GC(15) Pause Young (Normal) (G1 Evacuation Pause) 317M-&amp;gt;293M(512M) 2.364ms\n&#x5B;4.165s]&#x5B;info]&#x5B;gc] GC(16) Pause Young (Concurrent Start) (G1 Evacuation Pause) 317M-&amp;gt;293M(512M) 3.671ms\n<\/pre><\/div>\n\n\n<p>We can see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>which method is used on line 1 (here G1)<\/li>\n\n\n\n<li>The type of GC (Young Normal)<\/li>\n\n\n\n<li>The zone memory usage (from line 18) before and after GC: 317M-&gt;293M<\/li>\n\n\n\n<li>The size of the zone between parenthesis: 512M<\/li>\n\n\n\n<li>Time spent by GC: 2.364ms<\/li>\n<\/ul>\n\n\n\n<p>For even more details, option <code>-XX:+PrintGCDetails<\/code> can be added to startup arguments. Example output:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;1.545s]&#x5B;info]&#x5B;gc           ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 31M-&amp;gt;26M(512M) 34.069ms\n&#x5B;1.545s]&#x5B;info]&#x5B;gc,cpu       ] GC(0) User=0.03s Sys=0.02s Real=0.03s\n&#x5B;1.624s]&#x5B;info]&#x5B;gc,start     ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)\n&#x5B;1.624s]&#x5B;info]&#x5B;gc,task      ] GC(1) Using 2 workers of 2 for evacuation\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,phases    ] GC(1)   Pre Evacuate Collection Set: 1.8ms\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,phases    ] GC(1)   Evacuate Collection Set: 30.9ms\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,phases    ] GC(1)   Post Evacuate Collection Set: 2.3ms\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,phases    ] GC(1)   Other: 0.2ms\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,heap      ] GC(1) Eden regions: 21-&amp;gt;0(21)\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,heap      ] GC(1) Survivor regions: 4-&amp;gt;4(4)\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,heap      ] GC(1) Old regions: 17-&amp;gt;38\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,heap      ] GC(1) Humongous regions: 11-&amp;gt;11\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,metaspace ] GC(1) Metaspace: 6718K(7040K)-&amp;gt;6718K(7040K) NonClass: 6121K(6400K)-&amp;gt;6121K(6400K) Class: 596K(640K)-&amp;gt;596K(640K)\n&#x5B;1.659s]&#x5B;info]&#x5B;gc           ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 52M-&amp;gt;52M(512M) 35.162ms\n&#x5B;1.659s]&#x5B;info]&#x5B;gc,cpu       ] GC(1) User=0.04s Sys=0.02s Real=0.04s\n<\/pre><\/div>\n\n\n<p>You might end up with too much information and get lost on what you are really trying to achieve.<\/p>\n\n\n\n<p>Creating graphs based on that is not an easy task with Excel. I found this one: <a href=\"https:\/\/www.ibm.com\/docs\/en\/mon-diag-tools?topic=monitoring-diagnostic-tools-garbage-collection-memory-visualizer\" target=\"_blank\" rel=\"noreferrer noopener\">IBM Monitoring and Diagnostic Tools<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Heap Dump<\/h3>\n\n\n\n<p>Once you confirmed the memory leak by creating graph from previous metrics, you might wonder what part of the code (ie. class) is faulty. This could be achieved by creating heap dumps.<\/p>\n\n\n\n<p>The command to do that is:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\njmap -dump:file=heap.dmp &lt;PID&gt;\n<\/pre><\/div>\n\n\n<p>It is important to know that it will freeze the application and it can take some time which depends on the heap size and server performances (CPU and disk).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">jconsole<\/h2>\n\n\n\n<p><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/management\/jconsole.html\" target=\"_blank\" rel=\"noreferrer noopener\">jconsole<\/a>, included with Java, can monitor a JVM, local or distant via <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_Management_Extensions\" target=\"_blank\" rel=\"noreferrer noopener\">JMX<\/a> in real time. It focuses on memory and threads metrics.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"859\" src=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\" alt=\"\" class=\"wp-image-26814\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-300x252.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-768x644.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1536x1289.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999.png 1766w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">VisualVM<\/h3>\n\n\n\n<p><a href=\"https:\/\/visualvm.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">VisualVm<\/a> has many nice features to monitor JVM in real time and to analyze heap and core dumps. It can also be used to analyze heap dump offline. Additionally, it supports extra feature with <a href=\"https:\/\/visualvm.github.io\/plugins.html\" target=\"_blank\" rel=\"noreferrer noopener\">plugins<\/a> like GC information.<\/p>\n\n\n\n<p>For example, the summary view of a heap dump:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"818\" height=\"668\" src=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-06-18_05_26-VisualVM-2.1.6.png\" alt=\"\" class=\"wp-image-26576\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-06-18_05_26-VisualVM-2.1.6.png 818w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-06-18_05_26-VisualVM-2.1.6-300x245.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-06-18_05_26-VisualVM-2.1.6-768x627.png 768w\" sizes=\"auto, (max-width: 818px) 100vw, 818px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">SaaS Tools<\/h2>\n\n\n\n<p>There are also online tools available like <a href=\"https:\/\/gceasy.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">gceasy<\/a> or <a href=\"https:\/\/heaphero.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">heaphero<\/a>. They are nice and, with help of machine learning, provide results with very interesting advice on memory leaks or JVM parameters tuning, but there is an important downside you should be aware of:<\/p>\n\n\n\n<p><strong>Your JVM memory dump is on the cloud!<\/strong><\/p>\n\n\n\n<p>So, if you have strict rules on data privacy or sensitivity, you most not use them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Keep in mind that monitor could add a little CPU load to your application JVM (if not a lot for dumps), but also disk usage, so use it wisely. Increasing heap size is not always the answer to OutOfMemoryError as it can increase GC pauses. In short, there is no quick fix for every situation.<\/p>\n\n\n\n<p>Also note that I did not cover another important part of JVM performance troubleshooting. CPU can also be a limit of JVM performance. In this case, you have to use thread stack which will finger point high consuming threads and possible locks which prevent good performances.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the most common errors while running an application is &#8220;out of memory&#8221;. And Java is no different besides errors being named exceptions. The exact exception name you might have encountered is: And, in most cases, it is related to Java heap. I will go through a few reminders on what Java heap is. [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197],"tags":[3023,214,355,3022,2987],"type_dbi":[],"class_list":["post-26565","post","type-post","status-publish","format-standard","hentry","category-application-integration-middleware","tag-garbage-collector","tag-java","tag-java-virtual-machine","tag-jmap","tag-jstat"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>My JVM Memory Analyzes Toolkit - dbi Blog<\/title>\n<meta name=\"description\" content=\"What tools can I use to monitor a Java Virtual Machine memory usage?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"My JVM Memory Analyzes Toolkit\" \/>\n<meta property=\"og:description\" content=\"What tools can I use to monitor a Java Virtual Machine memory usage?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-24T06:30:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-11T08:18:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"My JVM Memory Analyzes Toolkit\",\"datePublished\":\"2023-07-24T06:30:28+00:00\",\"dateModified\":\"2024-09-11T08:18:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/\"},\"wordCount\":888,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/07\\\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\",\"keywords\":[\"garbage collector\",\"Java\",\"Java Virtual Machine\",\"jmap\",\"jstat\"],\"articleSection\":[\"Application integration &amp; Middleware\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/\",\"name\":\"My JVM Memory Analyzes Toolkit - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/07\\\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\",\"datePublished\":\"2023-07-24T06:30:28+00:00\",\"dateModified\":\"2024-09-11T08:18:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\"},\"description\":\"What tools can I use to monitor a Java Virtual Machine memory usage?\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#primaryimage\",\"url\":\"http:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/07\\\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\",\"contentUrl\":\"http:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2023\\\/07\\\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/my-jvm-memory-analyzes-toolkit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"My JVM Memory Analyzes Toolkit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/middleware-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"My JVM Memory Analyzes Toolkit - dbi Blog","description":"What tools can I use to monitor a Java Virtual Machine memory usage?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/","og_locale":"en_US","og_type":"article","og_title":"My JVM Memory Analyzes Toolkit","og_description":"What tools can I use to monitor a Java Virtual Machine memory usage?","og_url":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/","og_site_name":"dbi Blog","article_published_time":"2023-07-24T06:30:28+00:00","article_modified_time":"2024-09-11T08:18:28+00:00","og_image":[{"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png","type":"","width":"","height":""}],"author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"My JVM Memory Analyzes Toolkit","datePublished":"2023-07-24T06:30:28+00:00","dateModified":"2024-09-11T08:18:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/"},"wordCount":888,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#primaryimage"},"thumbnailUrl":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png","keywords":["garbage collector","Java","Java Virtual Machine","jmap","jstat"],"articleSection":["Application integration &amp; Middleware"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/","url":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/","name":"My JVM Memory Analyzes Toolkit - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#primaryimage"},"thumbnailUrl":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png","datePublished":"2023-07-24T06:30:28+00:00","dateModified":"2024-09-11T08:18:28+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"description":"What tools can I use to monitor a Java Virtual Machine memory usage?","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#primaryimage","url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png","contentUrl":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2023\/07\/2023-07-18-11_24_09-Java-Monitoring-Management-Console-192.168.33.11_9999-1024x859.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/my-jvm-memory-analyzes-toolkit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"My JVM Memory Analyzes Toolkit"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/26565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=26565"}],"version-history":[{"count":23,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/26565\/revisions"}],"predecessor-version":[{"id":26909,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/26565\/revisions\/26909"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=26565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=26565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=26565"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=26565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}