<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Joel Sikström</title>
    <link>https://joelsiks.com/</link>
    <description>Recent content on Joel Sikström</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 08 Aug 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://joelsiks.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>About</title>
      <link>https://joelsiks.com/about/</link>
      <pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m Joel, a Software Engineer with a MSc in Computer and Information Engineering from Uppsala University (Civilingenjör i Informationsteknologi). I am currently working in the Webex team at Cisco, developing the Webex communications platform for non-embedded platforms. I&amp;rsquo;ve previously been working in the Java Platform Group at Oracle, developing the HotSpot JVM as part of the (Z)GC team.&lt;/p&gt;&#xA;&lt;p&gt;The content on this blog represents my personal opinions and does not necessarily reflect the views of my employer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenJDK Contributions</title>
      <link>https://joelsiks.com/openjdk/</link>
      <pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/openjdk/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m an OpenJDK &lt;a href=&#34;https://openjdk.org/bylaws#project-roles&#34;&gt;Reviewer&lt;/a&gt; mainly focused on the Garbage Collection (GC) subsystem(s), with an emphasis on ZGC. You can see my active roles in the OpenJDK Community Census &lt;a href=&#34;https://openjdk.org/census#jsikstro&#34;&gt;https://openjdk.org/census#jsikstro&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;contributions&#34;&gt;Contributions&lt;/h2&gt;&#xA;&lt;p&gt;You can find the bulk of my OpenJDK contributions in the following links:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mainline PRs: &lt;a href=&#34;https://github.com/openjdk/jdk/pulls?q=author:jsikstro&#34;&gt;https://github.com/openjdk/jdk/pulls?q=author:jsikstro&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Valhalla PRs: &lt;a href=&#34;https://github.com/openjdk/valhalla/pulls?q=author:jsikstro&#34;&gt;https://github.com/openjdk/valhalla/pulls?q=author:jsikstro&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;projects&#34;&gt;Projects&lt;/h2&gt;&#xA;&lt;p&gt;My largest contribution is leading an effort to redesign ZGC&amp;rsquo;s memory allocation layer to address virtual address space fragmentation. This work has internally been dubbed the &lt;em&gt;Mapped Cache&lt;/em&gt;, for its inclusion of a cache for mapped memory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenJDK NMethod Entry Barriers</title>
      <link>https://joelsiks.com/posts/nmethod-entry-barriers/</link>
      <pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/nmethod-entry-barriers/</guid>
      <description>&lt;p&gt;An nmethod, which I&amp;rsquo;ll refer to as NMethod, is HotSpot&amp;rsquo;s representation of a natively compiled Java method, the result of a JIT compilation, typically produced by the C1 or C2 compilers. NMethods are interesting because they require cooperation from the Garbage Collector (GC) to execute efficiently while fitting into Java&amp;rsquo;s automatic memory management model.&lt;/p&gt;&#xA;&lt;p&gt;In this post, we&amp;rsquo;ll deep dive into how NMethods are designed and the mechanism used to enable concurrent execution and cooperation between application threads and GC workers. We&amp;rsquo;ll cover things like barriers (multiple kinds!), x86 and AArch64 assembly, self- and cross-modifying code, data dependencies, and much more. The underlying theory in this area is a gold mine of interesting technical stuff!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agentic AI Workflows for OpenJDK Development</title>
      <link>https://joelsiks.com/posts/openjdk-ai-agents/</link>
      <pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/openjdk-ai-agents/</guid>
      <description>Details and reflections on how I&amp;rsquo;ve been using AI to approach OpenJDK development</description>
    </item>
    <item>
      <title>JIT Compilers and Cache Coherency</title>
      <link>https://joelsiks.com/posts/jit-compilers-and-cache-coherency/</link>
      <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/jit-compilers-and-cache-coherency/</guid>
      <description>Deep-dive into cache coherency considerations for JIT compilers on AArch64</description>
    </item>
    <item>
      <title>Why is my first C&#43;&#43; (m)allocation always 72 KB?</title>
      <link>https://joelsiks.com/posts/cpp-emergency-pool-72kb-allocation/</link>
      <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/cpp-emergency-pool-72kb-allocation/</guid>
      <description>Why is my first C++ (m)allocation always 72 KB?? It&amp;rsquo;s the &amp;rsquo;emergency pool&amp;rsquo; for exceptions, here&amp;rsquo;s how I uncovered it using GDB and digging through the source code of libstdc++, glibc and Valgrind!</description>
    </item>
    <item>
      <title>Optimizing Java Class Metadata in Project Valhalla</title>
      <link>https://joelsiks.com/posts/valhalla-inlinelayoutinfo-array-optimization/</link>
      <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/valhalla-inlinelayoutinfo-array-optimization/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;While digging into &lt;a href=&#34;https://openjdk.org/projects/valhalla/&#34;&gt;Project Valhalla&lt;/a&gt;, I encountered a subtle part of the JVM that turned out to be a prime opportunity for optimization. This exploration led to an approach that shaves unused memory from Java class instance metadata.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll walk through some of the behind-the-scenes details of one of Project Valhalla&amp;rsquo;s core features: value classes, and the concept of flattening (or inlining, the term I will use here). Whether you&amp;rsquo;re a JVM developer or just deeply curious about how Java works under the hood, this technical deep dive is for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NUMA-Aware Relocation in ZGC</title>
      <link>https://joelsiks.com/posts/zgc-numa-aware-relocation/</link>
      <pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/zgc-numa-aware-relocation/</guid>
      <description>&lt;p&gt;NUMA-aware relocation is a feature recently added to ZGC, one of the garbage collectors in OpenJDK, with the introduction of &lt;a href=&#34;https://bugs.openjdk.org/browse/JDK-8359683&#34;&gt;JDK-8359683&lt;/a&gt;, set to release in JDK 26.  Building on the recent memory allocation overhaul (see &lt;a href=&#34;../zgc-heap-memory-allocation/&#34;&gt;&amp;ldquo;How ZGC allocates memory for the Java heap&amp;rdquo;&lt;/a&gt;), this feature further enhances NUMA support and optimization in ZGC. For those interested in the code changes, see the relevant &lt;a href=&#34;https://github.com/openjdk/jdk/pull/26898&#34;&gt;GitHub pull request&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This post is a technical deep dive into how NUMA is incorporated into the Relocation phase of ZGC. We&amp;rsquo;ll start with some background on the Relocation phase, to provide context for both the domain and the previous non-NUMA implementation. From there, we&amp;rsquo;ll explore why NUMA matters for GC performance and walk through the details of how NUMA-aware relocation is implemented in practice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How MADV_COLLAPSE chooses a NUMA node</title>
      <link>https://joelsiks.com/posts/madv-collapse-numa/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/madv-collapse-numa/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;MADV_COLLAPSE is a &lt;a href=&#34;https://man7.org/linux/man-pages/man2/madvise.2.html&#34;&gt;madvise(2)&lt;/a&gt; advice (added in Linux 6.1) that requests a best-effort, synchronous collapse of native pages in a range into Transparent Huge Pages (THPs). As the man page states:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Perform a best-effort synchronous collapse of the native pages mapped by the memory range into Transparent Huge Pages (THPs). MADV_COLLAPSE operates on the current state of memory of the calling process and makes no persistent changes or guarantees on how pages will be mapped, constructed, or faulted in the future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How ZGC allocates memory for the Java heap</title>
      <link>https://joelsiks.com/posts/zgc-heap-memory-allocation/</link>
      <pubDate>Wed, 16 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/zgc-heap-memory-allocation/</guid>
      <description>&lt;p&gt;This post explores how ZGC, one of the garbage collectors in the OpenJDK, allocates memory for the Java heap, focusing on enhancements introduced in &lt;a href=&#34;https://bugs.openjdk.org/browse/JDK-8350441&#34;&gt;JDK-8350441&lt;/a&gt; with the Mapped Cache. A garbage collector does much more than just collect garbage - and that&amp;rsquo;s what I want to unpack in this post. Whether you&amp;rsquo;re a Java nerd yearning for details, a GC enthusiast, or just curious about how ZGC uses memory behind the scenes, this deep dive is for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic DNS failure with ddclient and Namecheap</title>
      <link>https://joelsiks.com/posts/ddns-failure/</link>
      <pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/ddns-failure/</guid>
      <description>&lt;p&gt;TLDR; If you are experiencing similar issues, upgrade to the latest version of ddclient or change IP-check website to something other than dynamicdns.park-your-domain.com. See &lt;a href=&#34;#discussion&#34;&gt;Discussion&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;backstory&#34;&gt;Backstory&lt;/h2&gt;&#xA;&lt;p&gt;On the morning of 22/3 I noticed that my website was down. My first thought was maybe the power went out and my server never rebooted, but no, it was running perfectly. The next thing I checked was my domain configuration, which I&amp;rsquo;ve had issues pop up randomly with before. When I pinged my domain I noticed a very strange IP address being resolved (an address in China) &lt;a href=&#34;https://whatismyipaddress.com/ip/1.0.1.1&#34;&gt;[1]&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Inspecting OpenJDK performance on Linux using perf</title>
      <link>https://joelsiks.com/posts/perf-linux/</link>
      <pubDate>Sun, 16 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/perf-linux/</guid>
      <description>&lt;p&gt;Analyzing performance can be challenging, especially when diagnosing regressions. Finding the right methods to investigate performance issues is often time-consuming and complex.&#xA;You may have heard of perf, a powerful Linux tool for performance measurement, available from the kernel.&lt;/p&gt;&#xA;&lt;p&gt;This post will guide you through using perf to analyze performance on Linux, serving as a practical &amp;ldquo;quick start&amp;rdquo; guide for those new to profiling Java applications with perf. It&amp;rsquo;s not meant to be a comprehensive tutorial, as many of those already exist in the extensive documentation of &lt;a href=&#34;https://en.wikipedia.org/wiki/Perf_(Linux)&#34;&gt;perf&lt;/a&gt; and other &lt;a href=&#34;https://www.brendangregg.com/perf.html&#34;&gt;excellent sources&lt;/a&gt;. However, the examples provided may be all you need or, at the very least, give you an idea of where to look for deeper insights.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Huge Pages on Linux</title>
      <link>https://joelsiks.com/posts/linux-huge-pages/</link>
      <pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/linux-huge-pages/</guid>
      <description>&lt;p&gt;When I first found out about huge pages I was a bit confused. Why do we need larger pages? How do I configure this? Is it always on? I had many questions. The first thing you should know is that the concept of larger pages has many names, although they all achieve the same thing: increase the page size, usually to something larger than 4096 bytes (4 KB), which is the default on many systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install OpenJDK on Windows</title>
      <link>https://joelsiks.com/posts/openjdk-install-windows/</link>
      <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/openjdk-install-windows/</guid>
      <description>&lt;h2 id=&#34;download&#34;&gt;Download&lt;/h2&gt;&#xA;&lt;p&gt;Start by navigating to &lt;a href=&#34;https://jdk.java.net/&#34;&gt;https://jdk.java.net/&lt;/a&gt; and download the latest build. At the time of writing, JDK23 is the latest version and can be found at &lt;a href=&#34;https://jdk.java.net/23/&#34;&gt;https://jdk.java.net/23/&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Download the zip file shown next to Windows/x64. Although you could unzip the contents anywhere on your computer, I recommend that you should place them in &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;, inside a folder named the same way the current JDK version is. Since I am downloading JDK23, I will unzip the contents of the zip file into &lt;code&gt;C:\Program Files\OpenJDK\23\&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>University Projects</title>
      <link>https://joelsiks.com/uni/</link>
      <pubDate>Wed, 03 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/uni/</guid>
      <description>&lt;p&gt;In June 2024 I graduated from the Master&amp;rsquo;s Programme in Computer and Information Engineering at Uppsala University. These are some of the projects I have done during my studies.&lt;/p&gt;&#xA;&lt;h2 id=&#34;jsmalloc--oracle-masters-thesis&#34;&gt;jsmalloc @ Oracle (Master&amp;rsquo;s Thesis)&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://joelsiks.com/images/jsmalloc.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Adapted TLSF memory allocator for use in ZGC, a garbage collector in the HotSpot Java Virtual Machine.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/joelsiks/jsmalloc&#34;&gt;Available on GitHub&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://inside.java/2024/06/19/thesis-zgc-fragmentation/&#34;&gt;Overview on inside.java&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://urn.kb.se/resolve?urn=urn:nbn:se:uu:diva-530931&#34;&gt;Full report&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;admirals&#34;&gt;Admirals&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://joelsiks.com/images/admirals.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Game Engine for developing 2D, real-time strategy (RTS), multiplayer games in C++.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Addressing Fragmentation in ZGC through Custom Allocators</title>
      <link>https://joelsiks.com/posts/addressing-fragmentation/</link>
      <pubDate>Wed, 19 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://joelsiks.com/posts/addressing-fragmentation/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;This is a repost of my blog entry about my master thesis at Oracle. The original was published on &lt;a href=&#34;https://inside.java/2024/06/19/thesis-zgc-fragmentation/&#34;&gt;inside.java&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;My name is &lt;a href=&#34;https://www.linkedin.com/in/joel-sikstrom/&#34;&gt;Joel&lt;/a&gt; and I am currently finishing my 5-year degree in Computer and Information Engineering at Uppsala University, with a focus on Software Engineering. This blog post details my master thesis work as part of the GC team at Oracle’s Stockholm office in the spring of 2024. I’ve worked closely with Casper Norrbin and Niclas Gärds, who have also conducted their masters theses as Oracle this spring in the same area as I have.&#xA;Problem Statement&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
