<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Per Minborg on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/author/per-minborg/</link><description>Articles written by Per Minborg on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Mar 2023 10:08:21 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/author/per-minborg/index.xml" rel="self" type="application/rss+xml"/><item><title>Exhaustive JUnit5 Testing: Combinations, Permutations, Products</title><link>https://foojayio.github.io/website/today/exhaustive-junit5-testing-with-combinations-permutations-and-products/</link><pubDate>Wed, 08 Mar 2023 10:08:21 +0000</pubDate><guid>https://foojayio.github.io/website/today/exhaustive-junit5-testing-with-combinations-permutations-and-products/</guid><description>&lt;p&gt;Unit testing constitutes an integral part of the process of providing high-quality software.&lt;/p&gt;
&lt;p&gt;But, how can one write tests covering all variants of several operations?&lt;/p&gt;
&lt;p&gt;Read this article and learn how to use JUnit5 in conjunction with combinations, permutations, and products.&lt;/p&gt;
&lt;h3 id="h3-0-test-support-libraries"&gt;Test Support Libraries&lt;/h3&gt;
&lt;p&gt;There are many libraries that make testing better in different aspects. Here are some of them:&lt;/p&gt;
&lt;h4 id="agitar-one"&gt;Agitar One&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.agitar.com/solutions/products/software_agitation.html" title="Agitator" target="_blank" rel="noopener noreferrer"&gt;Agitator&lt;/a&gt;
 automatically creates dynamic test cases, synthesizes sets of input data, and analyzes the results.&lt;/p&gt;</description></item><item><title>Which is the Fastest JVM: OpenJDK or GraalVM?</title><link>https://foojayio.github.io/website/today/which-is-the-fastest-jvm-openjdk-or-graalvm/</link><pubDate>Wed, 08 Feb 2023 10:51:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/which-is-the-fastest-jvm-openjdk-or-graalvm/</guid><description>&lt;p&gt;How is a high-performance, low-latency Java application affected by the JVM version used?&lt;/p&gt;
&lt;p&gt;Every nanosecond counts for trading and other applications where messages between two different threads are exchanged in about 250ns!&lt;/p&gt;
&lt;p&gt;Read this article and find out which JDK variant comes out at the top!&lt;/p&gt;
&lt;h3 id="h3-0-benchmarks"&gt;Benchmarks&lt;/h3&gt;
&lt;p&gt;This article will use open-source &lt;a href="https://bit.ly/3wWnXy8" target="_blank" rel="noopener noreferrer"&gt;Chronicle Queue&lt;/a&gt;
 to exchange 256-byte messages between two threads whereby all messages are also stored in shared memory (/dev/shm is used to minimise the impact of the disk subsystem).&lt;/p&gt;</description></item><item><title>How to Reduce Cloud Cost by 99% for EDA Kafka Applications</title><link>https://foojayio.github.io/website/today/how-to-reduce-cloud-cost-by-99-for-eda-kafka-applications/</link><pubDate>Wed, 11 Jan 2023 13:35:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-reduce-cloud-cost-by-99-for-eda-kafka-applications/</guid><description>&lt;p&gt;While the Cloud offers great convenience and flexibility, the operational cost for applications deployed in it can sometimes be significant.&lt;/p&gt;
&lt;p&gt;In this article, we show a way to substantially reduce operating costs in latency-sensitive Event-Driven Architecture (EDA) Java applications by migrating from Kafka to Chronicle Queue open-source, which is a more resource-efficient and&lt;a href="https://dzone.com/articles/kafka-vs-chronicle-for-microservices" title=" lower-latency" target="_blank" rel="noopener noreferrer"&gt;lower-latency&lt;/a&gt;
 queue implementation.&lt;/p&gt;
&lt;h3 id="h3-0-what-is-eda"&gt;What is EDA?&lt;/h3&gt;
&lt;p&gt;An EDA (Event-Driven Architecture) application is a distributed application where events (in the form of messages or DTOs) are produced, detected, consumed, and reacted to.&lt;/p&gt;</description></item><item><title>How Object Reuse Can Reduce Latency and Improve Performance</title><link>https://foojayio.github.io/website/today/how-object-reuse-can-reduce-latency-and-improve-performance/</link><pubDate>Wed, 16 Nov 2022 15:33:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-object-reuse-can-reduce-latency-and-improve-performance/</guid><description>&lt;p&gt;&lt;strong&gt;Become familiar with the art of object reuse by reading this article and learn the pros and cons of different reuse strategies in a multi-threaded Java application. This allows you to write more performant code with less latency.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the use of objects in object-oriented languages such as Java provides an excellent way of abstracting away complexity, frequent object creation can come with downsides in terms of increased memory pressure and garbage collection which will have an adverse effect on applications&amp;rsquo; latency and performance.&lt;/p&gt;</description></item><item><title>Creating Terabyte Sized Queues with Low-Latency</title><link>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</link><pubDate>Wed, 02 Nov 2022 10:45:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-terabyte-sized-queues-with-low-latency/</guid><description>&lt;p&gt;Queues are often fundamental components in software design patterns.&lt;/p&gt;
&lt;p&gt;But, what if there are millions of messages received every second and multi-process consumers need to be able to read the complete ledger of all messages?&lt;/p&gt;
&lt;p&gt;Java can only hold so much information before the heap becomes a limiting factor with high-impacting garbage collections as a result, potentially preventing us from fulfilling targeted SLAs or even halting the JVM for seconds or even minutes.&lt;/p&gt;</description></item><item><title>Why the Fastest Way of Serializing a Java Field is not Serializing it at All</title><link>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</link><pubDate>Tue, 25 Oct 2022 12:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-the-fastest-way-of-serializing-a-java-field-is-not-serializing-it-at-all/</guid><description>&lt;p&gt;This article elaborates on different ways of serializing Java objects and benchmarks performance for the variants. Read this article and become aware of different ways to improve Java serialization performance.&lt;/p&gt;
&lt;p&gt;In a previous article about &lt;a href="https://chronicle.software/queue/" title="open-source Chronicle Queue" target="_blank" rel="noopener noreferrer"&gt;open-source Chronicle Queue&lt;/a&gt;
, there was some benchmarking and method profiling indicating that the speed of serialization had a significant impact on execution performance. After all, this is only to be expected as Chronicle Queue (and other persisted queue libraries) must convert Java objects located on the heap to binary data, which is subsequently stored in files. Even for the most internally efficient libraries, this inevitable serialization procedure will largely dictate performance.&lt;/p&gt;</description></item><item><title>Let's Create Mappers Without Creating Underlying Objects in Java</title><link>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</link><pubDate>Tue, 20 Sep 2022 09:16:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/did-you-know-you-can-create-mappers-without-creating-underlying-objects-in-java/</guid><description>&lt;p&gt;As most Java developers know, putting values in a Java Map (like a HashMap) involves creating a large number of auxiliary objects under the covers.&lt;/p&gt;
&lt;p&gt;For example, a HashMap with int keys and long values might, for each entry, create a wrapped Integer, a wrapped Long object and a Node that holds the former values together with a hash value and a link to other potential Node objects sharing the same hash bucket.&lt;/p&gt;</description></item></channel></rss>