This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/accumulo-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 013c8139 Automatic Site Publish by Buildbot
013c8139 is described below

commit 013c8139c5661d3e4bf347de316652508ab5b3f6
Author: buildbot <us...@infra.apache.org>
AuthorDate: Mon Apr 22 18:30:59 2024 +0000

    Automatic Site Publish by Buildbot
---
 .../09/does-a-compactor-return-memory-to-OS.html   | 784 +++++++++++++++++++++
 output/feed.xml                                    | 779 ++++++++++++++++----
 .../java_11_G1_x1_s256_OS_manualaftercomp.png      | Bin 0 -> 43355 bytes
 .../java_11_G1_x1_s256_OS_manualeverymin.png       | Bin 0 -> 50814 bytes
 .../java_11_G1_x1_s256_VM_manualaftercomp.png      | Bin 0 -> 75308 bytes
 .../java_11_G1_x1_s256_VM_manualeverymin.png       | Bin 0 -> 82280 bytes
 .../java_11_G1_x2_s256_OS.png                      | Bin 0 -> 28529 bytes
 .../java_11_G1_x2_s256_VM.png                      | Bin 0 -> 47531 bytes
 .../java_11_UseShenandoah_x2_s256_OS.png           | Bin 0 -> 42611 bytes
 .../java_11_UseShenandoah_x2_s256_VM.png           | Bin 0 -> 61003 bytes
 .../java_17_G1_x1_s256_periodic60000_OS.png        | Bin 0 -> 44141 bytes
 .../java_17_G1_x1_s256_periodic60000_VM.png        | Bin 0 -> 71509 bytes
 ...a_17_G1_x1_s256_periodic60000_concurrent_OS.png | Bin 0 -> 43634 bytes
 ...a_17_G1_x1_s256_periodic60000_concurrent_VM.png | Bin 0 -> 70558 bytes
 .../java_17_G1_x2_s256_periodic60000_OS.png        | Bin 0 -> 43125 bytes
 .../java_17_G1_x2_s256_periodic60000_VM.png        | Bin 0 -> 66620 bytes
 ...a_17_G1_x2_s256_periodic60000_concurrent_OS.png | Bin 0 -> 45506 bytes
 ...a_17_G1_x2_s256_periodic60000_concurrent_VM.png | Bin 0 -> 63855 bytes
 .../java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png     | Bin 0 -> 41548 bytes
 .../java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png     | Bin 0 -> 52411 bytes
 ...java_17_shenandoah_x1_s256_UseShenandoah_OS.png | Bin 0 -> 40636 bytes
 ...java_17_shenandoah_x1_s256_UseShenandoah_VM.png | Bin 0 -> 65872 bytes
 ...java_17_shenandoah_x2_s256_UseShenandoah_OS.png | Bin 0 -> 43690 bytes
 ...java_17_shenandoah_x2_s256_UseShenandoah_VM.png | Bin 0 -> 61385 bytes
 .../java_21_G1_x2_s256_periodic60000_OS.png        | Bin 0 -> 44449 bytes
 .../java_21_G1_x2_s256_periodic60000_VM.png        | Bin 0 -> 66057 bytes
 ...ZGC_x2_s256_UseZGC_generational_uncommit_OS.png | Bin 0 -> 43089 bytes
 ...ZGC_x2_s256_UseZGC_generational_uncommit_VM.png | Bin 0 -> 57747 bytes
 .../java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png     | Bin 0 -> 43433 bytes
 .../java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png     | Bin 0 -> 53290 bytes
 ...java_21_shenandoah_x1_s256_UseShenandoah_OS.png | Bin 0 -> 28541 bytes
 ...java_21_shenandoah_x1_s256_UseShenandoah_VM.png | Bin 0 -> 54165 bytes
 ...java_21_shenandoah_x2_s256_UseShenandoah_OS.png | Bin 0 -> 44314 bytes
 ...java_21_shenandoah_x2_s256_UseShenandoah_VM.png | Bin 0 -> 60324 bytes
 output/index.html                                  |  14 +-
 output/news/index.html                             |  13 +-
 output/search_data.json                            |   8 +
 37 files changed, 1434 insertions(+), 164 deletions(-)

diff --git a/output/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html 
b/output/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html
new file mode 100644
index 00000000..807b23db
--- /dev/null
+++ b/output/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html
@@ -0,0 +1,784 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link 
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css"; 
rel="stylesheet" 
integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9"
 crossorigin="anonymous">
+<link 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css";
 rel="stylesheet">
+<link rel="stylesheet" type="text/css" 
href="https://cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.css";>
+<link href="/css/accumulo.css" rel="stylesheet" type="text/css">
+
+<title>Does a compactor process return memory to the OS?</title>
+
+<script 
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"; 
integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" 
crossorigin="anonymous"></script>
+<script 
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js";
 
integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm"
 crossorigin="anonymous"></script>
+<script type="text/javascript" 
src="https://cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.js";></script>
+<script type="text/javascript" 
src="https://www.apachecon.com/event-images/snippet.js";></script>
+<script>
+  // show location of canonical site if not currently on the canonical site
+  $(function() {
+    var host = window.location.host;
+    if (typeof host !== 'undefined' && host !== 'accumulo.apache.org') {
+      $('#non-canonical').show();
+    }
+  });
+
+  $(function() {
+    // decorate section headers with anchors
+    return $("h2, h3, h4, h5, h6").not(".accordion-header").each(function(i, 
el) {
+      var $el, icon, id;
+      $el = $(el);
+      id = $el.attr('id');
+      icon = '<span class="fa-solid fa-link"></span>';
+      if (id) {
+        return $el.append($("<a />").addClass("header-link").attr("href", "#" 
+ id).html(icon));
+      }
+    });
+  });
+
+  // fix sidebar width in documentation
+  $(function() {
+    var $affixElement = $('div[data-spy="affix"]');
+    $affixElement.width($affixElement.parent().width());
+  });
+</script>
+
+</head>
+<body style="padding-top: 100px">
+
+  <nav class="navbar navbar-expand-lg navbar-light fixed-top bg-light">
+  <div class="container">
+    <a class="navbar-brand" href="/">
+      <img alt="Apache Accumulo" id="nav-logo" src="/images/accumulo-logo.png" 
width="200">
+    </a>
+    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" 
data-bs-target="#navbar-items">
+      <span class="navbar-toggler-icon"></span>
+    </button>
+    <div class="collapse navbar-collapse" id="navbar-items">
+      <ul class="navbar-nav me-auto">
+        <li class="nav-item"><a class="nav-link" 
href="/downloads">Download</a></li>
+        <li class="nav-item"><a class="nav-link" href="/tour">Tour</a></li>
+        <li class="nav-item dropdown">
+          <a class="nav-link dropdown-toggle" href="#" role="button" 
data-bs-toggle="dropdown">Releases</a>
+          <ul class="dropdown-menu">
+            <li><a class="dropdown-item" href="/release/accumulo-3.0.0/">3.0.0 
(Latest non-LTM)</a></li>
+            <li><a class="dropdown-item" href="/release/accumulo-2.1.2/">2.1.2 
(Latest LTM)</a></li>
+            <li><a class="dropdown-item" 
href="/release/accumulo-1.10.4/">1.10.4 (Legacy LTM)</a></li>
+            <li><a class="dropdown-item" href="/release/">Archive</a></li>
+          </ul>
+        </li>
+        <li class="nav-item dropdown">
+          <a class="nav-link dropdown-toggle" href="#" role="button" 
data-bs-toggle="dropdown">Documentation</a>
+          <ul class="dropdown-menu">
+            <li><a class="dropdown-item" href="/docs/2.x">User Manual 
(2.x)</a></li>
+            <li><a class="dropdown-item" href="/docs/2.x/apidocs">Javadocs 
(2.x)</a></li>
+            <li><a class="dropdown-item" href="/api">Public API</a></li>
+            <li><a class="dropdown-item" href="/quickstart-1.x">Quickstart 
(1.x)</a></li>
+            <li><a class="dropdown-item" 
href="/accumulo2-maven-plugin">Accumulo Maven Plugin</a></li>
+            <li><a class="dropdown-item" 
href="/1.10/accumulo_user_manual.html">User Manual (1.10)</a></li>
+            <li><a class="dropdown-item" href="/1.10/apidocs">Javadocs 
(1.10)</a></li>
+            <li><a class="dropdown-item" href="/external-docs">External 
Docs</a></li>
+            <li><a class="dropdown-item" href="/docs-archive/">Archive</a></li>
+          </ul>
+        </li>
+        <li class="nav-item dropdown">
+          <a class="nav-link dropdown-toggle" href="#" role="button" 
data-bs-toggle="dropdown">Community</a>
+          <ul class="dropdown-menu">
+            <li><a class="dropdown-item" href="/contact-us">Contact Us</a></li>
+            <li><a class="dropdown-item" href="/how-to-contribute">How To 
Contribute</a></li>
+            <li><a class="dropdown-item" href="/people">People</a></li>
+            <li><a class="dropdown-item" href="/related-projects">Related 
Projects</a></li>
+          </ul>
+        </li>
+        <li class="nav-item"><a class="nav-link" href="/search">Search</a></li>
+      </ul>
+      <ul class="navbar-nav ms-auto">
+        <li class="nav-item dropdown">
+          <a class="nav-link dropdown-toggle" href="#" role="button" 
data-bs-toggle="dropdown">
+            <img alt="Apache Software Foundation" 
src="https://www.apache.org/foundation/press/kit/feather.svg"; width="15"/>
+          </a>
+          <ul class="dropdown-menu">
+            <li><a class="dropdown-item" href="https://www.apache.org";>Apache 
Homepage <span class="fa-solid fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/licenses/";>License <span class="fa-solid 
fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/foundation/sponsorship";>Sponsorship <span 
class="fa-solid fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/security";>Security <span class="fa-solid 
fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/foundation/thanks";>Thanks <span class="fa-solid 
fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/foundation/policies/conduct";>Code of Conduct <span 
class="fa-solid fa-up-right-from-square"></span></a></li>
+            <li><a class="dropdown-item" 
href="https://www.apache.org/events/current-event.html";>Current Event <span 
class="fa-solid fa-up-right-from-square"></span></a></li>
+          </ul>
+        </li>
+      </ul>
+    </div>
+  </div>
+</nav>
+
+
+  <div class="container">
+    <div class="row">
+      <div class="col-md-12">
+
+        <div id="non-canonical" style="display: none; background-color: 
#F0E68C; padding-left: 1em;">
+          Visit the official site at: <a 
href="https://accumulo.apache.org";>https://accumulo.apache.org</a>
+        </div>
+        <div id="content">
+          
+          <h1 class="title">Does a compactor process return memory to the 
OS?</h1>
+          
+          <p>
+<b>Author: </b>&nbsp;&nbsp;Dominic Garguilo, Kevin Rathbun<br>
+<b>Date: </b>&nbsp;&nbsp;09 Apr 2024<br>
+
+</p>
+
+<h2 id="goal">Goal</h2>
+<p>The goal of the project was to determine if, once an Accumulo process is 
finished using memory, the JVM would release this unused memory back to the 
operating system. This was specifically observed in a Compactor process during 
the tests, but the findings should apply to any Accumulo Server process. We 
looked at the memory usage of the compactor process specifically to help 
understand if oversubscribing compactors on a machine is a viable option.</p>
+
+<p>As background information, it’s important to note that modern JVMs are 
expected to release memory back to the operating system, rather than just 
growing from the initial heap size (-Xms) to the maximum heap size (-Xmx) and 
never releasing it. This behavior was introduced in Java 11 through the <a 
href="https://openjdk.org/jeps/346";>JEP 346: Promptly Return Unused Committed 
Memory from G1</a>. This feature aims to improve the efficiency of memory usage 
by actively returning Java heap m [...]
+<h3 id="test-scenario">Test Scenario</h3>
+<p>There could be a scenario where the amount of memory on a machine limits 
the number of compactors that can be run. For example, on a machine with 32GB 
of memory, if each compactor process uses 6GB of memory, we can only “fit” 5 
compactors on that machine (32/6=5.333). Since each compactor process only runs 
on a single core, we would only be utilizing 5 cores on that machine where we 
would like to be using as many as we can.</p>
+
+<p>If the compactor process does not return the memory to the OS, then we are 
stuck with only using the following number of compactor processes:
+<code class="language-plaintext highlighter-rouge">(total memory)/(memory per 
compactor)</code>.
+If the compactor processes return the memory to the OS, i.e. does not stay at 
the maximum 6GB once they reach it, then we can oversubscribe the memory 
allowing us to run more compactor processes on that machine.</p>
+
+<p>It should be noted that there is an inherent risk when oversubscribing 
processes that the user must be willing to accept if they choose to do 
oversubscribe. In this case, there is the possibility that all compactors run 
at the same time which might use all the memory on the machine. This could 
cause one or more of the compactor processes to be killed by the OOM killer.</p>
+
+<h2 id="test-setup">Test Setup</h2>
+
+<h3 id="environment-prerequisites">Environment Prerequisites</h3>
+
+<p>The machines used for testing were running Pop!_OS 22.04 a debian-based OS. 
The following package installation and usage steps may vary if one were try to 
repeat these steps.</p>
+
+<h4 id="install-gnuplot">Install gnuplot</h4>
+
+<p>This was used for plotting the memory usage of the compactor over time from 
the perspective of the OS</p>
+
+<ol>
+  <li><code class="language-plaintext highlighter-rouge">sudo apt install 
gnuplot</code></li>
+  <li>gnuplot was started with the command <code class="language-plaintext 
highlighter-rouge">gnuplot</code></li>
+</ol>
+
+<h4 id="install-visualvm">Install VisualVM</h4>
+
+<p>This was used for plotting the memory usage of the compactor over time from 
the perspective of the JVM</p>
+
+<ol>
+  <li>Downloaded the zip from <a 
href="https://visualvm.github.io/";>visualvm.github.io</a></li>
+  <li>Extracted with <code class="language-plaintext highlighter-rouge">unzip 
visualvm_218.zip</code></li>
+  <li>VisualVM was started with the command <code class="language-plaintext 
highlighter-rouge">./path/to/visualvm_218/bin/visualvm</code></li>
+</ol>
+
+<h4 id="configure-and-start-accumulo">Configure and start accumulo</h4>
+
+<p>Accumulo 2.1 was used for experimentation. To stand up a single node 
instance, <a href="https://github.com/apache/fluo-uno";>fluo-uno</a> was 
used.</p>
+
+<p>Steps taken to configure accumulo to start compactors:</p>
+
+<ol>
+  <li>Uncommented lines in <code class="language-plaintext 
highlighter-rouge">fluo-uno/install/accumulo-2.1.2/conf/cluster.yaml</code> 
regarding the compaction coordinator and compactor q1. A single compactor 
process was used, q1. This allows the external compaction processes to start 
up.</li>
+  <li>Configured the java args for the compactor process in “accumulo-env.sh.” 
Line:
+<code class="language-plaintext highlighter-rouge">compactor) 
JAVA_OPTS=('-Xmx256m' '-Xms256m' "${JAVA_OPTS[@]}") ;;</code></li>
+  <li>Started accumulo with <code class="language-plaintext 
highlighter-rouge">uno start accumulo</code></li>
+</ol>
+
+<h4 id="install-java-versions">Install java versions</h4>
+
+<ol>
+  <li>Installed java versions 11, 17 and 21. For example, Java 17 was 
installed with:
+    <ol>
+      <li><code class="language-plaintext highlighter-rouge">sudo apt install 
openjdk-17-jdk</code></li>
+      <li><code class="language-plaintext highlighter-rouge">sudo 
update-alternatives --config java</code> and select the intended version before 
starting the accumulo instance</li>
+      <li>Ensured <code class="language-plaintext 
highlighter-rouge">JAVA_HOME</code> was set to the intended version of java 
before each test run</li>
+    </ol>
+  </li>
+</ol>
+
+<h2 id="running-the-test">Running the test</h2>
+
+<ol>
+  <li>Started accumulo using <a 
href="https://github.com/apache/fluo-uno";>fluo-uno</a> (after changing the 
mentioned configuration)
+    <ul>
+      <li><code class="language-plaintext highlighter-rouge">uno start 
accumulo</code></li>
+    </ul>
+  </li>
+  <li>Opened VisualVM and selected the running compactor q1 process taking 
note of the PID</li>
+  <li>Ran <code class="language-plaintext 
highlighter-rouge">mem_usage_script.sh &lt;compactor process PID&gt;</code>. 
This collected measurements of memory used by the compactor process over time 
from the perspective of the OS. We let this continue to run while the 
compaction script was running.</li>
+  <li>Configured the external compaction script as needed and executed:
+    <ul>
+      <li><code class="language-plaintext highlighter-rouge">uno jshell 
experiment.jsh</code></li>
+    </ul>
+  </li>
+  <li>Memory usage was monitored from the perspective of the JVM (using 
VisualVM) and from the perspective of the OS (using our collection script).
+Navigated to the “Monitor” tab of the compactor in VisualVM to see the graph 
of memory usage from JVM perspective.
+Followed the info given in the <a href="#os-memory-data-collection-script">OS 
Memory Data Collection Script</a> section to plot the memory usage from OS 
perspective.</li>
+</ol>
+
+<p>Helpful resources:</p>
+<ul>
+  <li><a 
href="https://accumulo.apache.org/blog/2021/07/08/external-compactions.html";>External
 Compactions accumulo blog post</a></li>
+  <li><a 
href="https://docs.oracle.com/en/java/javase/21/gctuning/z-garbage-collector.html#GUID-8637B158-4F35-4E2D-8E7B-9DAEF15BB3CD";>Z
 garbage collector heap size docs</a></li>
+  <li><a 
href="https://docs.oracle.com/en/java/javase/21/gctuning/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D";>Generational
 Garbage Collection docs</a></li>
+  <li><a 
href="https://docs.oracle.com/en/java/javase/21/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573";>G1
 garbage collector docs</a></li>
+  <li><a 
href="https://thomas.preissler.me/blog/2021/05/02/release-memory-back-to-the-os-with-java-11";>Java
 11 and memory release article</a></li>
+</ul>
+
+<h3 id="external-compaction-test-script">External compaction test script</h3>
+
+<p>Initiates an external compaction of 700MB of data (20 files of size 35MB) 
on Compactor q1.</p>
+
+<p><strong><em>referred to as experiment.jsh in the test setup 
section</em></strong></p>
+
+<div class="language-java highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="kn">import</span> <span 
class="nn">org.apache.accumulo.core.conf.Property</span><span 
class="o">;</span> 
+
+<span class="kt">int</span> <span class="n">dataSize</span> <span 
class="o">=</span> <span class="mi">35_000_000</span><span class="o">;</span> 
+<span class="kt">byte</span><span class="o">[]</span> <span 
class="n">data</span> <span class="o">=</span> <span class="k">new</span> <span 
class="kt">byte</span><span class="o">[</span><span 
class="n">dataSize</span><span class="o">];</span> 
+<span class="nc">Arrays</span><span class="o">.</span><span 
class="na">fill</span><span class="o">(</span><span class="n">data</span><span 
class="o">,</span> <span class="o">(</span><span class="kt">byte</span><span 
class="o">)</span> <span class="mi">65</span><span class="o">);</span> 
+<span class="nc">String</span> <span class="n">tableName</span> <span 
class="o">=</span> <span class="s">"testTable"</span><span class="o">;</span> 
+
+<span class="kt">void</span> <span class="nf">ingestAndCompact</span><span 
class="o">()</span> <span class="kd">throws</span> <span 
class="nc">Exception</span> <span class="o">{</span>
+   <span class="k">try</span> <span class="o">{</span> 
+       <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">delete</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">);</span> 
+   <span class="o">}</span> <span class="k">catch</span> <span 
class="o">(</span><span class="nc">TableNotFoundException</span> <span 
class="n">e</span><span class="o">)</span> <span class="o">{</span> 
+       <span class="c1">// ignore </span>
+   <span class="o">}</span> 
+   
+   <span class="nc">System</span><span class="o">.</span><span 
class="na">out</span><span class="o">.</span><span 
class="na">println</span><span class="o">(</span><span class="s">"Creating 
table "</span> <span class="o">+</span> <span class="n">tableName</span><span 
class="o">);</span> 
+   <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">create</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">);</span> 
+   
+   <span class="c1">// This is done to avoid system compactions, we want to 
initiate the compactions manually </span>
+   <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">setProperty</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">,</span> <span 
class="nc">Property</span><span class="o">.</span><span 
class="na">TABLE_MAJC_RATIO</span><span class="o">.</span><span 
class="na">getKey</span><span class="o">(),</span> <span 
class="s">"1000"</span><span class="o">);</span> 
+   <span class="c1">// Configure for external compaction </span>
+   <span class="n">client</span><span class="o">.</span><span 
class="na">instanceOperations</span><span class="o">().</span><span 
class="na">setProperty</span><span class="o">(</span><span 
class="s">"tserver.compaction.major.service.cs1.planner"</span><span 
class="o">,</span><span 
class="s">"org.apache.accumulo.core.spi.compaction.DefaultCompactionPlanner"</span><span
 class="o">);</span> 
+   <span class="n">client</span><span class="o">.</span><span 
class="na">instanceOperations</span><span class="o">().</span><span 
class="na">setProperty</span><span class="o">(</span><span 
class="s">"tserver.compaction.major.service.cs1.planner.opts.executors"</span><span
 class="o">,</span><span 
class="s">"[{\"name\":\"large\",\"type\":\"external\",\"queue\":\"q1\"}]"</span><span
 class="o">);</span> 
+   
+   <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">setProperty</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">,</span> <span 
class="s">"table.compaction.dispatcher"</span><span class="o">,</span> <span 
class="s">"org.apache.accumulo.core.spi.compaction.SimpleCompactionDispatcher"</span><span
 class="o">);</span> 
+   <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">setProperty</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">,</span> <span 
class="s">"table.compaction.dispatcher.opts.service"</span><span 
class="o">,</span> <span class="s">"cs1"</span><span class="o">);</span> 
+   
+   <span class="kt">int</span> <span class="n">numFiles</span> <span 
class="o">=</span> <span class="mi">20</span><span class="o">;</span> 
+   
+   <span class="k">try</span> <span class="o">(</span><span 
class="kt">var</span> <span class="n">writer</span> <span class="o">=</span> 
<span class="n">client</span><span class="o">.</span><span 
class="na">createBatchWriter</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">))</span> <span class="o">{</span> 
+       <span class="k">for</span> <span class="o">(</span><span 
class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span 
class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span 
class="o">&lt;</span> <span class="n">numFiles</span><span class="o">;</span> 
<span class="n">i</span><span class="o">++)</span> <span class="o">{</span> 
+           <span class="nc">Mutation</span> <span class="n">mut</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="nc">Mutation</span><span class="o">(</span><span class="s">"r"</span> 
<span class="o">+</span> <span class="n">i</span><span class="o">);</span> 
+           <span class="n">mut</span><span class="o">.</span><span 
class="na">at</span><span class="o">().</span><span 
class="na">family</span><span class="o">(</span><span 
class="s">"cf"</span><span class="o">).</span><span 
class="na">qualifier</span><span class="o">(</span><span 
class="s">"cq"</span><span class="o">).</span><span class="na">put</span><span 
class="o">(</span><span class="n">data</span><span class="o">);</span> 
+           <span class="n">writer</span><span class="o">.</span><span 
class="na">addMutation</span><span class="o">(</span><span 
class="n">mut</span><span class="o">);</span> 
+           <span class="n">writer</span><span class="o">.</span><span 
class="na">flush</span><span class="o">();</span>   
+   
+           <span class="nc">System</span><span class="o">.</span><span 
class="na">out</span><span class="o">.</span><span 
class="na">println</span><span class="o">(</span><span class="s">"Writing 
"</span> <span class="o">+</span> <span class="n">dataSize</span> <span 
class="o">+</span> <span class="s">" bytes to a single value"</span><span 
class="o">);</span> 
+           <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">flush</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">,</span> <span 
class="kc">null</span><span class="o">,</span> <span 
class="kc">null</span><span class="o">,</span> <span 
class="kc">true</span><span class="o">);</span> 
+       <span class="o">}</span> 
+   <span class="o">}</span>   
+   
+   <span class="nc">System</span><span class="o">.</span><span 
class="na">out</span><span class="o">.</span><span 
class="na">println</span><span class="o">(</span><span class="s">"Compacting 
table"</span><span class="o">);</span> 
+   <span class="n">client</span><span class="o">.</span><span 
class="na">tableOperations</span><span class="o">().</span><span 
class="na">compact</span><span class="o">(</span><span 
class="n">tableName</span><span class="o">,</span> <span class="k">new</span> 
<span class="nc">CompactionConfig</span><span class="o">().</span><span 
class="na">setWait</span><span class="o">(</span><span 
class="kc">true</span><span class="o">));</span> 
+   <span class="nc">System</span><span class="o">.</span><span 
class="na">out</span><span class="o">.</span><span 
class="na">println</span><span class="o">(</span><span class="s">"Finished 
table compaction"</span><span class="o">);</span>
+<span class="o">}</span> 
+
+<span class="n">ingestAndCompact</span><span class="o">();</span> 
+<span class="c1">// Optionally sleep and ingestAndCompact() again, or just 
execute the script again.</span>
+</code></pre></div></div>
+
+<h3 id="os-memory-data-collection-script">OS Memory Data Collection Script</h3>
+
+<p>Tracks the Resident Set Size (RSS) of the given PID over time, outputting 
the data to output_mem_usage.log.
+Data is taken every 5 seconds for an hour or until stopped.</p>
+
+<p><strong><em>referred to as mem_usage_script.sh in the test setup 
section</em></strong></p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="c">#!/bin/bash </span>
+<span class="nv">PID</span><span class="o">=</span><span class="nv">$1</span> 
+<span class="nb">echo</span> <span class="s2">"Tracking PID: </span><span 
class="nv">$PID</span><span class="s2">"</span> 
+<span class="nv">DURATION</span><span class="o">=</span>3600 <span class="c"># 
for 1 hour </span>
+<span class="nv">INTERVAL</span><span class="o">=</span>5    <span class="c"># 
every 5 seconds </span>
+<span class="nb">rm </span>output_mem_usage.log 
+
+<span class="k">while</span> <span class="o">[</span> <span 
class="nv">$DURATION</span> <span class="nt">-gt</span> 0 <span 
class="o">]</span><span class="p">;</span> <span class="k">do 
+    </span>ps <span class="nt">-o</span> %mem,rss <span class="nt">-p</span> 
<span class="nv">$PID</span> | <span class="nb">tail</span> <span 
class="nt">-n</span> +2 <span class="o">&gt;&gt;</span> output_mem_usage.log 
+    <span class="nb">sleep</span> <span class="nv">$INTERVAL</span> 
+    <span class="nv">DURATION</span><span class="o">=</span><span 
class="k">$((</span>DURATION <span class="o">-</span> INTERVAL<span 
class="k">))</span> 
+<span class="k">done</span>
+</code></pre></div></div>
+
+<p>After compactions have completed plot the data using gnuplot:</p>
+
+<div class="language-bash highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code>gnuplot
+<span class="nb">set </span>title <span class="s2">"Resident Set Size (RSS) 
Memory usage"</span> 
+<span class="nb">set </span>xlabel <span class="s2">"Time"</span>
+<span class="nb">set </span>ylabel <span class="s2">"Mem usage in 
kilobytes"</span>
+plot <span class="s2">"output_mem_usage.log"</span> using <span 
class="o">(</span><span class="nv">$0</span><span class="k">*</span>5<span 
class="o">)</span>:2 with lines title <span class="s1">'Mem usage'</span>
+</code></pre></div></div>
+
+<h2 id="data">Data</h2>
+
+<p>Important Notes:</p>
+<ul>
+  <li>ZGC and G1PeriodicGCInterval are not available with Java 11, so couldn’t 
be tested for</li>
+  <li>ZGenerational for ZGC is only available in Java 21, so couldn’t be 
tested for in Java 17</li>
+  <li>G1 GC is the default GC in Java 11, 17, and 21 (doesn’t need to be 
specified in java args)</li>
+</ul>
+
+<p>All Experiments Performed:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Java Version</th>
+      <th>Manual Compaction</th>
+      <th>Xmx=1G</th>
+      <th>Xmx=2G</th>
+      <th>Xms=256m</th>
+      <th>XX:G1PeriodicGCInterval=60000</th>
+      <th>XX:-G1PeriodicGCInvokesConcurrent</th>
+      <th>XX:+UseShenandoahGC</th>
+      <th>XX:+UseZGC</th>
+      <th>XX:ZUncommitDelay=120</th>
+      <th>XX:+ZGenerational</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>11</td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>11</td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>11</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>11</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>17</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>21</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>21</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td>🗸</td>
+    </tr>
+    <tr>
+      <td>21</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>21</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>21</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td>🗸</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 
id="java-11-g1-gc-with-manual-gc-via-visualvm-every-minute-java-args--xmx1g--xms256m">Java
 11 G1 GC with manual GC (via VisualVM) every minute. Java args: -Xmx1G 
-Xms256m</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-11-g1-gc-with-manual-gc-via-visualvm-after-each-compaction-java-args--xmx1g--xms256m">Java
 11 G1 GC with manual GC (via VisualVM) after each compaction. Java args: 
-Xmx1G -Xms256m</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 id="java-11-g1-gc-java-args--xmx2g--xms256">Java 11 G1 GC. Java args: 
-Xmx2G -Xms256</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a href="/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png" 
class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a href="/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png" 
class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-11-shenandoah-gc-java-args--xmx2g--xms256--xxuseshenandoahgc">Java 11 
Shenandoah GC. Java args: -Xmx2G -Xms256 -XX:+UseShenandoahGC</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png" 
class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png" 
class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-g1-gc-java-args--xmx1g--xms256m--xxg1periodicgcinterval60000">Java 
17 G1 GC. Java args: -Xmx1G -Xms256m -XX:G1PeriodicGCInterval=60000</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-g1-gc-java-args--xmx2g--xms256m--xxg1periodicgcinterval60000">Java 
17 G1 GC. Java args: -Xmx2G -Xms256m -XX:G1PeriodicGCInterval=60000</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-g1-gc-java-args--xmx1g--xms256m--xxg1periodicgcinterval60000--xx-g1periodicgcinvokesconcurrent">Java
 17 G1 GC. Java args: -Xmx1G -Xms256m -XX:G1PeriodicGCInterval=60000 
-XX:-G1PeriodicGCInvokesConcurrent</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzuncommitdelay120">Java 
17 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC -XX:ZUncommitDelay=120</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-shenandoah-gc-java-args--xmx1g--xms256m--xxuseshenandoahgc">Java 17 
Shenandoah GC. Java args: -Xmx1G -Xms256m -XX:+UseShenandoahGC</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-17-shenandoah-gc-java-args--xmx2g--xms256m--xxuseshenandoahgc">Java 17 
Shenandoah GC. Java args: -Xmx2G -Xms256m -XX:+UseShenandoahGC</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-21-g1-gc-java-args--xmx2g--xms256m--xxg1periodicgcinterval60000">Java 
21 G1 GC. Java args: -Xmx2G -Xms256m -XX:G1PeriodicGCInterval=60000</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-21-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzgenerational--xxzuncommitdelay120">Java
 21 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC -XX:+ZGenerational 
-XX:ZUncommitDelay=120</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-21-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzuncommitdelay120">Java 
21 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC -XX:ZUncommitDelay=120</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-21-shenandoah-gc-java-args--xmx1g--xms256m--xxuseshenandoahgc">Java 21 
Shenandoah GC. Java args: -Xmx1G -Xms256m -XX:+UseShenandoahGC</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h3 
id="java-21-shenandoah-gc-java-args--xmx2g--xms256m--xxuseshenandoahgc">Java 21 
Shenandoah GC. Java args: -Xmx2G -Xms256m -XX:+UseShenandoahGC</h3>
+<!-- creates a styled box with two images side by side -->
+<!-- accepts two URLs relative to the project root and two alt text strings -->
+<div class="p-3 border rounded d-flex">
+    <a 
href="/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png">
+       <img 
src="/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+    </a>
+    <a 
href="/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png">
+        <img 
src="/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+    </a>
+</div>
+
+<h2 id="conclusion">Conclusion</h2>
+<p>All the garbage collectors tested (G1 GC, Shenandoah GC, and ZGC) and all 
the Java versions tested (11, 17, 21) will release memory that is no longer 
used by a compactor, back to the OS*. Regardless of which GC is used, after an 
external compaction is done, most (but usually not all) memory is eventually 
released back to the OS and all memory is released back to the JVM. Although a 
comparable amount of memory is returned to the OS in each case, the amount of 
time it takes for the memo [...]
+
+<p>The amount that is never released back to the OS appears to be minimal and 
may only be present with G1 GC and Shenandoah GC. In the following graph with 
Java 17 using G1 GC, we see that the baseline OS memory usage before any 
compactions are done is a bit less than 400MB. We see that after a compaction 
is done and the garbage collection runs, this baseline settles at about 
500MB.</p>
+
+<p><a class="p-3 border rounded d-block" 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png">
+   <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+</a></p>
+
+<p>On the same test run, the JVM perspective (pictured in the graph below) 
shows that all memory is returned (memory usage drops back down to Xms=256m 
after garbage collection occurs).</p>
+
+<p><a class="p-3 border rounded d-block" 
href="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png">
+   <img 
src="/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the JVM 
perspective" />
+</a></p>
+
+<p>The roughly 100MB of unreturned memory is also present with Shenandoah GC 
in Java 17 and Java 21 but does not appear to be present with Java 11. With 
ZGC, however, we see several runs where nearly all the memory used during a 
compaction is returned to the OS (the graph below was from a run using ZGC with 
Java 21). These findings regarding the unreturned memory may or may not be 
significant. They may also be the result of variance between runs. More testing 
would need to be done to con [...]
+
+<p><a class="p-3 border rounded d-block" 
href="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png">
+   <img 
src="/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png"
 class="img-fluid rounded" alt="Graph showing memory usage from the OS 
perspective" />
+</a></p>
+
+<p>Another interesting finding was that the processes use more memory when 
more is allocated. These results were obtained from initiating a compaction of 
700MB of data (see experiment.jsh script). For example, setting 2GB versus 1GB 
of max heap for the compactor process results in a higher peak memory usage. 
During a compaction, when only allocated 1GB of heap space, the max heap space 
is not completely utilized. When allocated 2GB, compactions exceed 1GB of heap 
space used. It appears t [...]
+
+<p>Another difference found between the GCs tested was that Shenandoah GC 
sometimes required two garbage collections to occur after a compaction 
completed to clean up the memory. Based on our experiments, when a larger max 
heap size was allocated (2GB vs 1GB), the first garbage collection that 
occurred only cleaned up about half of the now unused memory, and another 
garbage collection had to occur for the rest to be cleaned up. This was not the 
case when 1GB of max heap space was allocat [...]
+
+<p>*Note: When using the default GC (G1 GC), garbage collection does not 
automatically occur unless further garbage collection settings are specified 
(e.g., G1PeriodicGCInterval)</p>
+
+
+<p><strong>View all posts in the <a href="/news">news archive</a></strong></p>
+
+        </div>
+
+        
+<footer>
+
+  <p><a href="https://www.apache.org/foundation/contributing";><img 
src="https://www.apache.org/images/SupportApache-small.png"; alt="Support the 
ASF" id="asf-logo" height="100" /></a></p>
+
+  <p>Copyright © 2011-2024 <a href="https://www.apache.org";>The Apache 
Software Foundation</a>.
+Licensed under the <a href="https://www.apache.org/licenses/";>Apache License, 
Version 2.0</a>.</p>
+
+  <p>Apache®, the names of Apache projects and their logos, and the multicolor 
feather
+logo are registered trademarks or trademarks of The Apache Software Foundation
+in the United States and/or other countries.</p>
+
+</footer>
+
+
+      </div>
+    </div>
+  </div>
+</body>
+</html>
diff --git a/output/feed.xml b/output/feed.xml
index e3736ca2..bbc7ab9b 100644
--- a/output/feed.xml
+++ b/output/feed.xml
@@ -6,11 +6,632 @@
 </description>
     <link>https://accumulo.apache.org/</link>
     <atom:link href="https://accumulo.apache.org/feed.xml"; rel="self" 
type="application/rss+xml"/>
-    <pubDate>Wed, 28 Feb 2024 18:16:00 +0000</pubDate>
-    <lastBuildDate>Wed, 28 Feb 2024 18:16:00 +0000</lastBuildDate>
+    <pubDate>Mon, 22 Apr 2024 18:30:52 +0000</pubDate>
+    <lastBuildDate>Mon, 22 Apr 2024 18:30:52 +0000</lastBuildDate>
     <generator>Jekyll v4.3.2</generator>
     
     
+      <item>
+        <title>Does a compactor process return memory to the OS?</title>
+        <description>&lt;h2 id=&quot;goal&quot;&gt;Goal&lt;/h2&gt;
+&lt;p&gt;The goal of the project was to determine if, once an Accumulo process 
is finished using memory, the JVM would release this unused memory back to the 
operating system. This was specifically observed in a Compactor process during 
the tests, but the findings should apply to any Accumulo Server process. We 
looked at the memory usage of the compactor process specifically to help 
understand if oversubscribing compactors on a machine is a viable 
option.&lt;/p&gt;
+
+&lt;p&gt;As background information, it’s important to note that modern JVMs 
are expected to release memory back to the operating system, rather than just 
growing from the initial heap size (-Xms) to the maximum heap size (-Xmx) and 
never releasing it. This behavior was introduced in Java 11 through the &lt;a 
href=&quot;https://openjdk.org/jeps/346&quot;&gt;JEP 346: Promptly Return 
Unused Committed Memory from G1&lt;/a&gt;. This feature aims to improve the 
efficiency of memory usage by ac [...]
+&lt;h3 id=&quot;test-scenario&quot;&gt;Test Scenario&lt;/h3&gt;
+&lt;p&gt;There could be a scenario where the amount of memory on a machine 
limits the number of compactors that can be run. For example, on a machine with 
32GB of memory, if each compactor process uses 6GB of memory, we can only “fit” 
5 compactors on that machine (32/6=5.333). Since each compactor process only 
runs on a single core, we would only be utilizing 5 cores on that machine where 
we would like to be using as many as we can.&lt;/p&gt;
+
+&lt;p&gt;If the compactor process does not return the memory to the OS, then 
we are stuck with only using the following number of compactor processes:
+&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(total 
memory)/(memory per compactor)&lt;/code&gt;.
+If the compactor processes return the memory to the OS, i.e. does not stay at 
the maximum 6GB once they reach it, then we can oversubscribe the memory 
allowing us to run more compactor processes on that machine.&lt;/p&gt;
+
+&lt;p&gt;It should be noted that there is an inherent risk when 
oversubscribing processes that the user must be willing to accept if they 
choose to do oversubscribe. In this case, there is the possibility that all 
compactors run at the same time which might use all the memory on the machine. 
This could cause one or more of the compactor processes to be killed by the OOM 
killer.&lt;/p&gt;
+
+&lt;h2 id=&quot;test-setup&quot;&gt;Test Setup&lt;/h2&gt;
+
+&lt;h3 id=&quot;environment-prerequisites&quot;&gt;Environment 
Prerequisites&lt;/h3&gt;
+
+&lt;p&gt;The machines used for testing were running Pop!_OS 22.04 a 
debian-based OS. The following package installation and usage steps may vary if 
one were try to repeat these steps.&lt;/p&gt;
+
+&lt;h4 id=&quot;install-gnuplot&quot;&gt;Install gnuplot&lt;/h4&gt;
+
+&lt;p&gt;This was used for plotting the memory usage of the compactor over 
time from the perspective of the OS&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;sudo apt install gnuplot&lt;/code&gt;&lt;/li&gt;
+  &lt;li&gt;gnuplot was started with the command &lt;code 
class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;gnuplot&lt;/code&gt;&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;h4 id=&quot;install-visualvm&quot;&gt;Install VisualVM&lt;/h4&gt;
+
+&lt;p&gt;This was used for plotting the memory usage of the compactor over 
time from the perspective of the JVM&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Downloaded the zip from &lt;a 
href=&quot;https://visualvm.github.io/&quot;&gt;visualvm.github.io&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;Extracted with &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;unzip visualvm_218.zip&lt;/code&gt;&lt;/li&gt;
+  &lt;li&gt;VisualVM was started with the command &lt;code 
class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;./path/to/visualvm_218/bin/visualvm&lt;/code&gt;&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;h4 id=&quot;configure-and-start-accumulo&quot;&gt;Configure and start 
accumulo&lt;/h4&gt;
+
+&lt;p&gt;Accumulo 2.1 was used for experimentation. To stand up a single node 
instance, &lt;a 
href=&quot;https://github.com/apache/fluo-uno&quot;&gt;fluo-uno&lt;/a&gt; was 
used.&lt;/p&gt;
+
+&lt;p&gt;Steps taken to configure accumulo to start compactors:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Uncommented lines in &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;fluo-uno/install/accumulo-2.1.2/conf/cluster.yaml&lt;/code&gt;
 regarding the compaction coordinator and compactor q1. A single compactor 
process was used, q1. This allows the external compaction processes to start 
up.&lt;/li&gt;
+  &lt;li&gt;Configured the java args for the compactor process in 
“accumulo-env.sh.” Line:
+&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compactor) 
JAVA_OPTS=('-Xmx256m' '-Xms256m' &quot;${JAVA_OPTS[@]}&quot;) 
;;&lt;/code&gt;&lt;/li&gt;
+  &lt;li&gt;Started accumulo with &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;uno start accumulo&lt;/code&gt;&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;h4 id=&quot;install-java-versions&quot;&gt;Install java versions&lt;/h4&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Installed java versions 11, 17 and 21. For example, Java 17 was 
installed with:
+    &lt;ol&gt;
+      &lt;li&gt;&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;sudo apt install 
openjdk-17-jdk&lt;/code&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;sudo update-alternatives --config java&lt;/code&gt; 
and select the intended version before starting the accumulo instance&lt;/li&gt;
+      &lt;li&gt;Ensured &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;JAVA_HOME&lt;/code&gt; was set to the intended 
version of java before each test run&lt;/li&gt;
+    &lt;/ol&gt;
+  &lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;h2 id=&quot;running-the-test&quot;&gt;Running the test&lt;/h2&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Started accumulo using &lt;a 
href=&quot;https://github.com/apache/fluo-uno&quot;&gt;fluo-uno&lt;/a&gt; 
(after changing the mentioned configuration)
+    &lt;ul&gt;
+      &lt;li&gt;&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;uno start accumulo&lt;/code&gt;&lt;/li&gt;
+    &lt;/ul&gt;
+  &lt;/li&gt;
+  &lt;li&gt;Opened VisualVM and selected the running compactor q1 process 
taking note of the PID&lt;/li&gt;
+  &lt;li&gt;Ran &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;mem_usage_script.sh &amp;lt;compactor process 
PID&amp;gt;&lt;/code&gt;. This collected measurements of memory used by the 
compactor process over time from the perspective of the OS. We let this 
continue to run while the compaction script was running.&lt;/li&gt;
+  &lt;li&gt;Configured the external compaction script as needed and executed:
+    &lt;ul&gt;
+      &lt;li&gt;&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;uno jshell experiment.jsh&lt;/code&gt;&lt;/li&gt;
+    &lt;/ul&gt;
+  &lt;/li&gt;
+  &lt;li&gt;Memory usage was monitored from the perspective of the JVM (using 
VisualVM) and from the perspective of the OS (using our collection script).
+Navigated to the “Monitor” tab of the compactor in VisualVM to see the graph 
of memory usage from JVM perspective.
+Followed the info given in the &lt;a 
href=&quot;#os-memory-data-collection-script&quot;&gt;OS Memory Data Collection 
Script&lt;/a&gt; section to plot the memory usage from OS 
perspective.&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Helpful resources:&lt;/p&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://accumulo.apache.org/blog/2021/07/08/external-compactions.html&quot;&gt;External
 Compactions accumulo blog post&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://docs.oracle.com/en/java/javase/21/gctuning/z-garbage-collector.html#GUID-8637B158-4F35-4E2D-8E7B-9DAEF15BB3CD&quot;&gt;Z
 garbage collector heap size docs&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://docs.oracle.com/en/java/javase/21/gctuning/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D&quot;&gt;Generational
 Garbage Collection docs&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://docs.oracle.com/en/java/javase/21/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573&quot;&gt;G1
 garbage collector docs&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://thomas.preissler.me/blog/2021/05/02/release-memory-back-to-the-os-with-java-11&quot;&gt;Java
 11 and memory release article&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3 id=&quot;external-compaction-test-script&quot;&gt;External compaction 
test script&lt;/h3&gt;
+
+&lt;p&gt;Initiates an external compaction of 700MB of data (20 files of size 
35MB) on Compactor q1.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;&lt;em&gt;referred to as experiment.jsh in the test 
setup section&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
+
+&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span 
class=&quot;nn&quot;&gt;org.apache.accumulo.core.conf.Property&lt;/span&gt;&lt;span
 class=&quot;o&quot;&gt;;&lt;/span&gt; 
+
+&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;dataSize&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;mi&quot;&gt;35_000_000&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; 
+&lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;dataSize&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;];&lt;/span&gt; 
+&lt;span class=&quot;nc&quot;&gt;Arrays&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;fill&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;mi&quot;&gt;65&lt;/span&gt;&lt;span cl [...]
+&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;testTable&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; 
+
+&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;ingestAndCompact&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
+   &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt; 
+       &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;delete&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt; 
+   &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nc&quot;&gt;TableNotFoundException&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt; 
+       &lt;span class=&quot;c1&quot;&gt;// ignore &lt;/span&gt;
+   &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 
+   
+   &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Creating table &quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span class=&quot;o& [...]
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;create&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt; 
+   
+   &lt;span class=&quot;c1&quot;&gt;// This is done to avoid system 
compactions, we want to initiate the compactions manually &lt;/span&gt;
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setProperty&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;Property&lt;/span&gt;&lt;span class=&quot;o&qu [...]
+   &lt;span class=&quot;c1&quot;&gt;// Configure for external compaction 
&lt;/span&gt;
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;instanceOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setProperty&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;tserver.compaction.major.service.cs1.planner&quot;&lt;/span&gt;&lt;span
 class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&g [...]
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;instanceOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setProperty&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;tserver.compaction.major.service.cs1.planner.opts.executors&quot;&lt;/span&gt;&lt;span
 class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class= [...]
+   
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setProperty&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;table.compaction.dispatcher&quot;&lt;/spa [...]
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setProperty&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;table.compaction.dispatcher.opts.service& [...]
+   
+   &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;numFiles&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; 
+   
+   &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;writer&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;createBatchWriter&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tableNa 
[...]
+       &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;numFiles&lt;/span&g [...]
+           &lt;span class=&quot;nc&quot;&gt;Mutation&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;mut&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;Mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;r&quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;& [...]
+           &lt;span class=&quot;n&quot;&gt;mut&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;at&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;family&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;cf&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;qualifier&lt;/span&gt;&lt;span class=&quot;o&quot;&gt; 
[...]
+           &lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;addMutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;mut&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt; 
+           &lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;();&lt;/span&gt;   
+   
+           &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Writing &quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;dataSize&lt;/span&gt; &lt;span class=&quot;o [...]
+           &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;flush&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot [...]
+       &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 
+   &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;   
+   
+   &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Compacting table&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt; 
+   &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;compact&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tableName&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;C [...]
+   &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Finished table 
compaction&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
+&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 
+
+&lt;span class=&quot;n&quot;&gt;ingestAndCompact&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;();&lt;/span&gt; 
+&lt;span class=&quot;c1&quot;&gt;// Optionally sleep and ingestAndCompact() 
again, or just execute the script again.&lt;/span&gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
+
+&lt;h3 id=&quot;os-memory-data-collection-script&quot;&gt;OS Memory Data 
Collection Script&lt;/h3&gt;
+
+&lt;p&gt;Tracks the Resident Set Size (RSS) of the given PID over time, 
outputting the data to output_mem_usage.log.
+Data is taken every 5 seconds for an hour or until stopped.&lt;/p&gt;
+
+&lt;p&gt;&lt;strong&gt;&lt;em&gt;referred to as mem_usage_script.sh in the 
test setup section&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
+
+&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;c&quot;&gt;#!/bin/bash &lt;/span&gt;
+&lt;span class=&quot;nv&quot;&gt;PID&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span 
class=&quot;nv&quot;&gt;$1&lt;/span&gt; 
+&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span 
class=&quot;s2&quot;&gt;&quot;Tracking PID: &lt;/span&gt;&lt;span 
class=&quot;nv&quot;&gt;$PID&lt;/span&gt;&lt;span 
class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; 
+&lt;span class=&quot;nv&quot;&gt;DURATION&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;3600 &lt;span class=&quot;c&quot;&gt;# for 
1 hour &lt;/span&gt;
+&lt;span class=&quot;nv&quot;&gt;INTERVAL&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;5    &lt;span class=&quot;c&quot;&gt;# 
every 5 seconds &lt;/span&gt;
+&lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;output_mem_usage.log 
+
+&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span 
class=&quot;nv&quot;&gt;$DURATION&lt;/span&gt; &lt;span 
class=&quot;nt&quot;&gt;-gt&lt;/span&gt; 0 &lt;span 
class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do 
+    &lt;/span&gt;ps &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; %mem,rss 
&lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span 
class=&quot;nv&quot;&gt;$PID&lt;/span&gt; | &lt;span 
class=&quot;nb&quot;&gt;tail&lt;/span&gt; &lt;span 
class=&quot;nt&quot;&gt;-n&lt;/span&gt; +2 &lt;span 
class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; output_mem_usage.log 
+    &lt;span class=&quot;nb&quot;&gt;sleep&lt;/span&gt; &lt;span 
class=&quot;nv&quot;&gt;$INTERVAL&lt;/span&gt; 
+    &lt;span class=&quot;nv&quot;&gt;DURATION&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span 
class=&quot;k&quot;&gt;$((&lt;/span&gt;DURATION &lt;span 
class=&quot;o&quot;&gt;-&lt;/span&gt; INTERVAL&lt;span 
class=&quot;k&quot;&gt;))&lt;/span&gt; 
+&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
+
+&lt;p&gt;After compactions have completed plot the data using 
gnuplot:&lt;/p&gt;
+
+&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;gnuplot
+&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;title &lt;span 
class=&quot;s2&quot;&gt;&quot;Resident Set Size (RSS) Memory 
usage&quot;&lt;/span&gt; 
+&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;xlabel &lt;span 
class=&quot;s2&quot;&gt;&quot;Time&quot;&lt;/span&gt;
+&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;ylabel &lt;span 
class=&quot;s2&quot;&gt;&quot;Mem usage in kilobytes&quot;&lt;/span&gt;
+plot &lt;span 
class=&quot;s2&quot;&gt;&quot;output_mem_usage.log&quot;&lt;/span&gt; using 
&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nv&quot;&gt;$0&lt;/span&gt;&lt;span 
class=&quot;k&quot;&gt;*&lt;/span&gt;5&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt;:2 with lines title &lt;span 
class=&quot;s1&quot;&gt;'Mem usage'&lt;/span&gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
+
+&lt;h2 id=&quot;data&quot;&gt;Data&lt;/h2&gt;
+
+&lt;p&gt;Important Notes:&lt;/p&gt;
+&lt;ul&gt;
+  &lt;li&gt;ZGC and G1PeriodicGCInterval are not available with Java 11, so 
couldn’t be tested for&lt;/li&gt;
+  &lt;li&gt;ZGenerational for ZGC is only available in Java 21, so couldn’t be 
tested for in Java 17&lt;/li&gt;
+  &lt;li&gt;G1 GC is the default GC in Java 11, 17, and 21 (doesn’t need to be 
specified in java args)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;All Experiments Performed:&lt;/p&gt;
+
+&lt;table&gt;
+  &lt;thead&gt;
+    &lt;tr&gt;
+      &lt;th&gt;Java Version&lt;/th&gt;
+      &lt;th&gt;Manual Compaction&lt;/th&gt;
+      &lt;th&gt;Xmx=1G&lt;/th&gt;
+      &lt;th&gt;Xmx=2G&lt;/th&gt;
+      &lt;th&gt;Xms=256m&lt;/th&gt;
+      &lt;th&gt;XX:G1PeriodicGCInterval=60000&lt;/th&gt;
+      &lt;th&gt;XX:-G1PeriodicGCInvokesConcurrent&lt;/th&gt;
+      &lt;th&gt;XX:+UseShenandoahGC&lt;/th&gt;
+      &lt;th&gt;XX:+UseZGC&lt;/th&gt;
+      &lt;th&gt;XX:ZUncommitDelay=120&lt;/th&gt;
+      &lt;th&gt;XX:+ZGenerational&lt;/th&gt;
+    &lt;/tr&gt;
+  &lt;/thead&gt;
+  &lt;tbody&gt;
+    &lt;tr&gt;
+      &lt;td&gt;11&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;11&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;11&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;11&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;17&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;21&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;21&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;21&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;21&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td&gt;21&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt;🗸&lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+      &lt;td&gt; &lt;/td&gt;
+    &lt;/tr&gt;
+  &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;h3 
id=&quot;java-11-g1-gc-with-manual-gc-via-visualvm-every-minute-java-args--xmx1g--xms256m&quot;&gt;Java
 11 G1 GC with manual GC (via VisualVM) every minute. Java args: -Xmx1G 
-Xms256m&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-11-g1-gc-with-manual-gc-via-visualvm-after-each-compaction-java-args--xmx1g--xms256m&quot;&gt;Java
 11 G1 GC with manual GC (via VisualVM) after each compaction. Java args: 
-Xmx1G -Xms256m&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 id=&quot;java-11-g1-gc-java-args--xmx2g--xms256&quot;&gt;Java 11 G1 GC. 
Java args: -Xmx2G -Xms256&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png&quot; 
class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png&quot; 
class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-11-shenandoah-gc-java-args--xmx2g--xms256--xxuseshenandoahgc&quot;&gt;Java
 11 Shenandoah GC. Java args: -Xmx2G -Xms256 -XX:+UseShenandoahGC&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-g1-gc-java-args--xmx1g--xms256m--xxg1periodicgcinterval60000&quot;&gt;Java
 17 G1 GC. Java args: -Xmx1G -Xms256m -XX:G1PeriodicGCInterval=60000&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-g1-gc-java-args--xmx2g--xms256m--xxg1periodicgcinterval60000&quot;&gt;Java
 17 G1 GC. Java args: -Xmx2G -Xms256m -XX:G1PeriodicGCInterval=60000&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-g1-gc-java-args--xmx1g--xms256m--xxg1periodicgcinterval60000--xx-g1periodicgcinvokesconcurrent&quot;&gt;Java
 17 G1 GC. Java args: -Xmx1G -Xms256m -XX:G1PeriodicGCInterval=60000 
-XX:-G1PeriodicGCInvokesConcurrent&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzuncommitdelay120&quot;&gt;Java
 17 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC 
-XX:ZUncommitDelay=120&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-shenandoah-gc-java-args--xmx1g--xms256m--xxuseshenandoahgc&quot;&gt;Java
 17 Shenandoah GC. Java args: -Xmx1G -Xms256m -XX:+UseShenandoahGC&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-17-shenandoah-gc-java-args--xmx2g--xms256m--xxuseshenandoahgc&quot;&gt;Java
 17 Shenandoah GC. Java args: -Xmx2G -Xms256m -XX:+UseShenandoahGC&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-21-g1-gc-java-args--xmx2g--xms256m--xxg1periodicgcinterval60000&quot;&gt;Java
 21 G1 GC. Java args: -Xmx2G -Xms256m -XX:G1PeriodicGCInterval=60000&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-21-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzgenerational--xxzuncommitdelay120&quot;&gt;Java
 21 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC -XX:+ZGenerational 
-XX:ZUncommitDelay=120&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-21-zgc-java-args--xmx2g--xms256m--xxusezgc--xxzuncommitdelay120&quot;&gt;Java
 21 ZGC. Java args: -Xmx2G -Xms256m -XX:+UseZGC 
-XX:ZUncommitDelay=120&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-21-shenandoah-gc-java-args--xmx1g--xms256m--xxuseshenandoahgc&quot;&gt;Java
 21 Shenandoah GC. Java args: -Xmx1G -Xms256m -XX:+UseShenandoahGC&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h3 
id=&quot;java-21-shenandoah-gc-java-args--xmx2g--xms256m--xxuseshenandoahgc&quot;&gt;Java
 21 Shenandoah GC. Java args: -Xmx2G -Xms256m -XX:+UseShenandoahGC&lt;/h3&gt;
+&lt;!-- creates a styled box with two images side by side --&gt;
+&lt;!-- accepts two URLs relative to the project root and two alt text strings 
--&gt;
+&lt;div class=&quot;p-3 border rounded d-flex&quot;&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png&quot;&gt;
+       &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+    &lt;/a&gt;
+    &lt;a 
href=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png&quot;&gt;
+        &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+    &lt;/a&gt;
+&lt;/div&gt;
+
+&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
+&lt;p&gt;All the garbage collectors tested (G1 GC, Shenandoah GC, and ZGC) and 
all the Java versions tested (11, 17, 21) will release memory that is no longer 
used by a compactor, back to the OS*. Regardless of which GC is used, after an 
external compaction is done, most (but usually not all) memory is eventually 
released back to the OS and all memory is released back to the JVM. Although a 
comparable amount of memory is returned to the OS in each case, the amount of 
time it takes for th [...]
+
+&lt;p&gt;The amount that is never released back to the OS appears to be 
minimal and may only be present with G1 GC and Shenandoah GC. In the following 
graph with Java 17 using G1 GC, we see that the baseline OS memory usage before 
any compactions are done is a bit less than 400MB. We see that after a 
compaction is done and the garbage collection runs, this baseline settles at 
about 500MB.&lt;/p&gt;
+
+&lt;p&gt;&lt;a class=&quot;p-3 border rounded d-block&quot; 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png&quot;&gt;
+   &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+&lt;/a&gt;&lt;/p&gt;
+
+&lt;p&gt;On the same test run, the JVM perspective (pictured in the graph 
below) shows that all memory is returned (memory usage drops back down to 
Xms=256m after garbage collection occurs).&lt;/p&gt;
+
+&lt;p&gt;&lt;a class=&quot;p-3 border rounded d-block&quot; 
href=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png&quot;&gt;
+   &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the JVM perspective&quot; /&gt;
+&lt;/a&gt;&lt;/p&gt;
+
+&lt;p&gt;The roughly 100MB of unreturned memory is also present with 
Shenandoah GC in Java 17 and Java 21 but does not appear to be present with 
Java 11. With ZGC, however, we see several runs where nearly all the memory 
used during a compaction is returned to the OS (the graph below was from a run 
using ZGC with Java 21). These findings regarding the unreturned memory may or 
may not be significant. They may also be the result of variance between runs. 
More testing would need to be done  [...]
+
+&lt;p&gt;&lt;a class=&quot;p-3 border rounded d-block&quot; 
href=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png&quot;&gt;
+   &lt;img 
src=&quot;/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png&quot;
 class=&quot;img-fluid rounded&quot; alt=&quot;Graph showing memory usage from 
the OS perspective&quot; /&gt;
+&lt;/a&gt;&lt;/p&gt;
+
+&lt;p&gt;Another interesting finding was that the processes use more memory 
when more is allocated. These results were obtained from initiating a 
compaction of 700MB of data (see experiment.jsh script). For example, setting 
2GB versus 1GB of max heap for the compactor process results in a higher peak 
memory usage. During a compaction, when only allocated 1GB of heap space, the 
max heap space is not completely utilized. When allocated 2GB, compactions 
exceed 1GB of heap space used. It app [...]
+
+&lt;p&gt;Another difference found between the GCs tested was that Shenandoah 
GC sometimes required two garbage collections to occur after a compaction 
completed to clean up the memory. Based on our experiments, when a larger max 
heap size was allocated (2GB vs 1GB), the first garbage collection that 
occurred only cleaned up about half of the now unused memory, and another 
garbage collection had to occur for the rest to be cleaned up. This was not the 
case when 1GB of max heap space was a [...]
+
+&lt;p&gt;*Note: When using the default GC (G1 GC), garbage collection does not 
automatically occur unless further garbage collection settings are specified 
(e.g., G1PeriodicGCInterval)&lt;/p&gt;
+</description>
+        <pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate>
+        
<link>https://accumulo.apache.org/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html</link>
+        <guid 
isPermaLink="true">https://accumulo.apache.org/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html</guid>
+        
+        
+        <category>blog</category>
+        
+      </item>
+    
       <item>
         <title>Apache Accumulo 1.10.4</title>
         <description>&lt;h2 id=&quot;about&quot;&gt;About&lt;/h2&gt;
@@ -1601,160 +2222,6 @@ stress the feature in other ways though.&lt;/p&gt;
         <guid 
isPermaLink="true">https://accumulo.apache.org/blog/2021/07/08/external-compactions.html</guid>
         
         
-        <category>blog</category>
-        
-      </item>
-    
-      <item>
-        <title>Jshell Accumulo Feature</title>
-        <description>&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
-
-&lt;p&gt;First introduced in Java 9, &lt;a 
href=&quot;https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8&quot;&gt;JShell&lt;/a&gt;
 is an interactive Read-Evaluate-Print-Loop (REPL)
-Java tool that interprets user’s input and outputs the results. This tool 
provides a convenient
-way to test out and execute quick tasks with Accumulo in the terminal. This 
feature is a part
-of the upcoming Accumulo 2.1 release. If you’re a developer and want to get 
involved in testing,
-&lt;a href=&quot;/contact-us/&quot;&gt;contact us&lt;/a&gt; or review our 
&lt;a href=&quot;/how-to-contribute/&quot;&gt;contributing 
guide&lt;/a&gt;.&lt;/p&gt;
-
-&lt;h2 id=&quot;major-features&quot;&gt;Major Features&lt;/h2&gt;
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;Default JShell script provides initial imports for interacting 
with Accumulo’s API and
-provided in Accumulo’s binary distribution tarball&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;On startup, JShell Accumulo  will automatically import the 
&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;CLASSPATH&lt;/code&gt;, load in a configured
-environment from user’s &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/accumulo-env.sh&lt;/code&gt;, and invoke 
&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/jshell-init.jsh&lt;/code&gt;
-to allow rapid Accumulo task executions&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;JShell Accumulo can startup using default/custom JShell script 
and users can append any JShell
-command-line &lt;a 
href=&quot;https://docs.oracle.com/javase/9/tools/jshell.htm#JSWOR-GUID-C337353B-074A-431C-993F-60C226163F00&quot;&gt;options&lt;/a&gt;
 to the startup command&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h2 id=&quot;booting-up-jshell-accumulo&quot;&gt;Booting Up JShell 
Accumulo&lt;/h2&gt;
-&lt;p&gt;1) Open up a terminal and navigate to Accumulo’s installation 
directory&lt;/p&gt;
-
-&lt;p&gt;2) To startup JShell with &lt;strong&gt;default script&lt;/strong&gt; 
use this command:&lt;/p&gt;
-
-&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ 
&lt;/span&gt;bin/accumulo jshell
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;p&gt;3) To startup JShell with &lt;strong&gt;custom script&lt;/strong&gt; 
use this command:&lt;/p&gt;
-
-&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ 
&lt;/span&gt;bin/accumulo jshell &lt;span 
class=&quot;nt&quot;&gt;--startup&lt;/span&gt; file/path/to/custom_script.jsh
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; One can execute the &lt;code 
class=&quot;language-plaintext highlighter-rouge&quot;&gt;jshell&lt;/code&gt; 
command to startup JShell. However, doing so will require
-manually importing the &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;CLASSPATH&lt;/code&gt; and the configured 
environment from &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/accumulo-env.sh&lt;/code&gt;
-and manually specifying the startup file for &lt;code 
class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/jshell-init.jsh&lt;/code&gt; before any 
Accumulo tasks
-can be performed. Using one of the startup commands above will automate that 
process
-for convenience.&lt;/p&gt;
-
-&lt;h2 id=&quot;jshell-accumulo-default-script&quot;&gt;JShell Accumulo 
Default Script&lt;/h2&gt;
-&lt;p&gt;The auto-generated &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;jshell-init.jsh&lt;/code&gt; is a customizable file 
located in Accumulo’s installation
-&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/&lt;/code&gt; directory. Inside, &lt;code 
class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;jshell-init.jsh&lt;/code&gt; contains &lt;a 
href=&quot;/api/&quot;&gt;Accumulo Java APIs&lt;/a&gt;
-formatted as import statements and &lt;a 
href=&quot;https://www.javadoc.io/doc/org.apache.accumulo/accumulo-core/latest/org/apache/accumulo/core/client/AccumuloClient.html&quot;&gt;AccumuloClient&lt;/a&gt;
 build implementation. On startup,
-the script automatically loads in the APIs and attempts to construct a client. 
Should additional
-APIs and/or code implementations be needed, simply append them to &lt;code 
class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;jshell-init.jsh&lt;/code&gt;.
-Alternatively, you can create a separate JShell script and specify the custom 
script’s file path
-on startup.&lt;/p&gt;
-
-&lt;p&gt;To construct an &lt;a 
href=&quot;https://www.javadoc.io/doc/org.apache.accumulo/accumulo-core/latest/org/apache/accumulo/core/client/AccumuloClient.html&quot;&gt;AccumuloClient&lt;/a&gt;,
 the provided &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;conf/jshell-init.jsh&lt;/code&gt; script finds
-and uses &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;accumulo-client.properties&lt;/code&gt; in 
Accumulo’s class path, and assigns the result
-to a variable called &lt;strong&gt;client&lt;/strong&gt;.&lt;/p&gt;
-
-&lt;p&gt;If &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;accumulo-client.properties&lt;/code&gt; is found, a 
similar result will be produced below:&lt;/p&gt;
-
-&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;Preparing JShell for Apache Accumulo
-
-Building Accumulo client using 
'jar:file:/home/accumulo/lib/accumulo-client.jar!/accumulo-client.properties'
-
-Use 'client' to interact with Accumulo
-
-|  Welcome to JShell -- Version 11.0.10
-|  For an introduction type: /help intro
-
-jshell&amp;gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-
-&lt;p&gt;If &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;accumulo-client.properties&lt;/code&gt; is not 
found, an &lt;a 
href=&quot;https://www.javadoc.io/doc/org.apache.accumulo/accumulo-core/latest/org/apache/accumulo/core/client/AccumuloClient.html&quot;&gt;AccumuloClient&lt;/a&gt;
 will not
-auto-generate and will produce the following result below:&lt;/p&gt;
-
-&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;Preparing JShell for Apache Accumulo
-
-'accumulo-client.properties' was not found on the classpath
-
-|  Welcome to JShell -- Version 11.0.10
-|  For an introduction type: /help intro
-
-jshell&amp;gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-
-&lt;h2 id=&quot;jshell-accumulo-example&quot;&gt;JShell Accumulo 
Example&lt;/h2&gt;
-&lt;p&gt;1) Booting up JShell Accumulo using default script&lt;/p&gt;
-
-&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;Preparing JShell for Apache Accumulo
-
-Building Accumulo client using 
'file:/home/accumulo/conf/accumulo-client.properties'
-
-Use 'client' to interact with Accumulo
-
-|  Welcome to JShell -- Version 11.0.10
-|  For an introduction type: /help intro
-
-jshell&amp;gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-
-&lt;p&gt;2) Providing JShell with an Accumulo task&lt;/p&gt;
-
-&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span 
class=&quot;c1&quot;&gt;// Create a table called 
&quot;GothamPD&quot;.&lt;/span&gt;
-  &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tableOperations&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;create&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;GothamPD&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
-
-  &lt;span class=&quot;c1&quot;&gt;// Create a Mutation object to hold all 
changes to a row in a table.&lt;/span&gt;
-  &lt;span class=&quot;c1&quot;&gt;// Each row has a unique row 
ID.&lt;/span&gt;
-  &lt;span class=&quot;nc&quot;&gt;Mutation&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;mutation&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;Mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;id0001&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
-
-  &lt;span class=&quot;c1&quot;&gt;// Create key/value pairs for Batman. Put 
them in the &quot;hero&quot; family.&lt;/span&gt;
-  &lt;span class=&quot;n&quot;&gt;mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;hero&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;alias&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;Batman&quot;&lt;/span&gt;&lt;span class=& [...]
-  &lt;span class=&quot;n&quot;&gt;mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;hero&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;Bruce Wayne&quot;&lt;/span&gt;&lt;span cla [...]
-  &lt;span class=&quot;n&quot;&gt;mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;hero&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;wearsCape?&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span clas [...]
-
-  &lt;span class=&quot;c1&quot;&gt;// Create a BatchWriter to the GothamPD 
table and add your mutation to it.&lt;/span&gt;
-  &lt;span class=&quot;c1&quot;&gt;// Try w/ resources will close for 
us.&lt;/span&gt;
-  &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nc&quot;&gt;BatchWriter&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;writer&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;createBatchWriter&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; [...]
-      &lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;addMutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;mutation&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-
-  &lt;span class=&quot;c1&quot;&gt;// Read and print all rows of the 
&quot;GothamPD&quot; table.&lt;/span&gt;
-  &lt;span class=&quot;c1&quot;&gt;// Try w/ resources will close for 
us.&lt;/span&gt;
-  &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nc&quot;&gt;ScannerBase&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;scan&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;createScanner&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot; 
[...]
-    &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Gotham Police Department Persons of 
Interest:&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
-
-    &lt;span class=&quot;c1&quot;&gt;// A Scanner is an extension of 
java.lang.Iterable so behaves just like one.&lt;/span&gt;
-    &lt;span class=&quot;n&quot;&gt;scan&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;forEach&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;System&lt;/span&gt; [...]
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-
-&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The fully-qualified class name for 
Accumulo Scanner or
-&lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;org.apache.accumulo.core.client.Scanner&lt;/code&gt; 
needs to be used due to conflicting issues with
-Java’s built-in java.util.Scanner. However, to shorten the Accumulo Scanner’s 
declaration, assign
-scan to &lt;code class=&quot;language-plaintext 
highlighter-rouge&quot;&gt;ScannerBase&lt;/code&gt; type instead.&lt;/p&gt;
-
-&lt;p&gt;3) Executing the Accumulo task above outputs:&lt;/p&gt;
-
-&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;mutation ==&amp;gt; 
org.apache.accumulo.core.data.Mutation@1
-Gotham Police Department Persons of Interest:
-Key : id0001 hero:alias [] 1618926204602 false            Value : Batman
-Key : id0001 hero:name [] 1618926204602 false             Value : Bruce Wayne
-Key : id0001 hero:wearsCape? [] 1618926204602 false       Value : true
-
-jshell&amp;gt;
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-</description>
-        <pubDate>Wed, 21 Apr 2021 00:00:00 +0000</pubDate>
-        
<link>https://accumulo.apache.org/blog/2021/04/21/jshell-accumulo-feature.html</link>
-        <guid 
isPermaLink="true">https://accumulo.apache.org/blog/2021/04/21/jshell-accumulo-feature.html</guid>
-        
-        
         <category>blog</category>
         
       </item>
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png
 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png
new file mode 100644
index 00000000..3062aacf
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualaftercomp.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png
 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png
new file mode 100644
index 00000000..25b91437
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_OS_manualeverymin.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png
 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png
new file mode 100644
index 00000000..2d8efea4
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualaftercomp.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png
 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png
new file mode 100644
index 00000000..deee77d7
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x1_s256_VM_manualeverymin.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png 
b/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png
new file mode 100644
index 00000000..11bbbf4f
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_OS.png differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png 
b/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png
new file mode 100644
index 00000000..39731f45
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_G1_x2_s256_VM.png differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png
 
b/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png
new file mode 100644
index 00000000..8cf486f4
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png
 
b/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png
new file mode 100644
index 00000000..27b7ca99
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_11_UseShenandoah_x2_s256_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png
new file mode 100644
index 00000000..44222a4d
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png
new file mode 100644
index 00000000..126d1eae
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png
new file mode 100644
index 00000000..54521205
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png
new file mode 100644
index 00000000..9f3960be
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x1_s256_periodic60000_concurrent_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png
new file mode 100644
index 00000000..b38f6daa
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png
new file mode 100644
index 00000000..7fb3f1bb
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_OS.png
new file mode 100644
index 00000000..b20b9b3f
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_VM.png
new file mode 100644
index 00000000..2675b7a3
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_G1_x2_s256_periodic60000_concurrent_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png
new file mode 100644
index 00000000..6f3070bf
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png
new file mode 100644
index 00000000..324e201f
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_ZGC_x2_s256_UseZGC_uncommit_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png
new file mode 100644
index 00000000..8f645353
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png
new file mode 100644
index 00000000..be6c6222
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x1_s256_UseShenandoah_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png
 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png
new file mode 100644
index 00000000..a082366c
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png
 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png
new file mode 100644
index 00000000..9f8a7d34
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_17_shenandoah_x2_s256_UseShenandoah_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png
 
b/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png
new file mode 100644
index 00000000..82ba3d7f
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png
 
b/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png
new file mode 100644
index 00000000..ea566583
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_G1_x2_s256_periodic60000_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png
 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png
new file mode 100644
index 00000000..24e62df7
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png
 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png
new file mode 100644
index 00000000..d74f5ca7
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_generational_uncommit_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png
 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png
new file mode 100644
index 00000000..e9245da8
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png
 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png
new file mode 100644
index 00000000..62ca6f33
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_ZGC_x2_s256_UseZGC_uncommit_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png
 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png
new file mode 100644
index 00000000..5428715a
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png
 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png
new file mode 100644
index 00000000..5b7d73d0
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x1_s256_UseShenandoah_VM.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png
 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png
new file mode 100644
index 00000000..f27967a6
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_OS.png
 differ
diff --git 
a/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png
 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png
new file mode 100644
index 00000000..20f50565
Binary files /dev/null and 
b/output/images/blog/202404_compactor_memory/java_21_shenandoah_x2_s256_UseShenandoah_VM.png
 differ
diff --git a/output/index.html b/output/index.html
index 7279750b..2c5f7249 100644
--- a/output/index.html
+++ b/output/index.html
@@ -178,6 +178,13 @@
         <p style="font-size: 24px; margin-bottom: 0px;">Latest News</p>
         
         
+        <div class="row latest-news-item">
+          <div class="col-sm-12" style="margin-bottom: 5px">
+           <span style="font-size: 12px; margin-right: 5px;">Apr 2024</span>
+           <a 
href="/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html">Does a 
compactor process return memory to the OS?</a>
+          </div>
+        </div>
+        
         <div class="row latest-news-item">
           <div class="col-sm-12" style="margin-bottom: 5px">
            <span style="font-size: 12px; margin-right: 5px;">Nov 2023</span>
@@ -206,13 +213,6 @@
           </div>
         </div>
         
-        <div class="row latest-news-item">
-          <div class="col-sm-12" style="margin-bottom: 5px">
-           <span style="font-size: 12px; margin-right: 5px;">Apr 2023</span>
-           <a href="/release/accumulo-1.10.3/">Apache Accumulo 1.10.3</a>
-          </div>
-        </div>
-        
         <div id="news-archive-link">
          <p>View all posts in the <a href="/news">news archive</a></p>
         </div>
diff --git a/output/news/index.html b/output/news/index.html
index d76810cb..656aa332 100644
--- a/output/news/index.html
+++ b/output/news/index.html
@@ -144,10 +144,21 @@
           <div>
 
 
-<h3>2023</h3>
+<h3>2024</h3>
 
   
   
+  <div class="row" style="margin-top: 15px">
+    <div class="col-md-1">Apr 09</div>
+    <div class="col-md-10"><a 
href="/blog/2024/04/09/does-a-compactor-return-memory-to-OS.html">Does a 
compactor process return memory to the OS?</a></div>
+  </div>
+
+  
+  
+    
+    <hr />
+    <h3>2023</h3>
+  
   <div class="row" style="margin-top: 15px">
     <div class="col-md-1">Nov 16</div>
     <div class="col-md-10"><a href="/release/accumulo-1.10.4/">Apache Accumulo 
1.10.4</a></div>
diff --git a/output/search_data.json b/output/search_data.json
index 28e762ea..2ee6f556 100644
--- a/output/search_data.json
+++ b/output/search_data.json
@@ -330,6 +330,14 @@
     },
   
   
+    "blog-2024-04-09-does-a-compactor-return-memory-to-os-html": {
+      "title": "Does a compactor process return memory to the OS?",
+      "content": "GoalThe goal of the project was to determine if, once an 
Accumulo process is finished using memory, the JVM would release this unused 
memory back to the operating system. This was specifically observed in a 
Compactor process during the tests, but the findings should apply to any 
Accumulo Server process. We looked at the memory usage of the compactor process 
specifically to help understand if oversubscribing compactors on a machine is a 
viable option.As background inform [...]
+      "url": " /blog/2024/04/09/does-a-compactor-return-memory-to-OS.html",
+      "categories": "blog"
+    }
+    ,
+  
     "release-accumulo-1-10-4": {
       "title": "Apache Accumulo 1.10.4",
       "content": "AboutApache Accumulo 1.10.4 is the final bug fix release of 
the 1.10 LTM releaseline. As of this release, the 1.10 release line is now 
considered end-of-life.This means that any fixes that are applied because of a 
bug found in thisversion will not be applied and released as a new 1.10 patch 
version, butinstead will be applied and released to the currently active 
release lines, ifthey apply to those versions.These release notes are 
highlights of the changes since 1.10.3. [...]

Reply via email to