Posts

Showing posts from April, 2012

Observability of the Java Virtual Machine

Image
The JVM is one of the most observable runtimes. It provides us lots of tools for troubleshooting a JVM application in production. 1. Thread observability Threads are how the JVM actually does work. When something is wrong in production, the symptom is almost always a thread: stopped, blocked, leaking etc. Thread dumps work on any JVM with no  instrumentation, no agents, no restarts. <Example project link with /threaddump endpoint>         // (1) Deadlock — two threads grab the same pair of locks in opposite order.         new Thread(() -> grab(LOCK_A, LOCK_B), "deadlock-A-then-B").start();         new Thread(() -> grab(LOCK_B, LOCK_A), "deadlock-B-then-A").start(); http://localhost:8080/actuator/threaddump To list the JVMS, we can use the command below. PS C:\observe-jvm> jps -lv 25296 jdk.jcmd/sun.tools.jps.Jps -Dapplication.home=C:\Program Files\Microsoft\jdk-21.0.3.9-hotspot -Xms8m -Djdk.module.main=...

Real life TestDrivenDevelopment benefit: Tests as Documentation

I ve been working on an integration component that listens to LDAP server and notifies applications about changes on LDAP entries. My component searches for LDAP change logs. And a change log has the "targetdn" attribute. Example: targetDn: uid=ND2392,ou=Users,dc=MyCompany There is a business rule about notification process: If Organization Unit is “Special Users”, skip the notification for that change. Example: targetDn: uid=ND2392,ou=Special Users,dc=MyCompany   This changeLog should be skipped because it is about "Special Users" organization unit. I am using a regular expression to parse the targetdn. I isolated the code that does parsing and wrote unit tests for many inputs. Of course I added a unit test for the Business Rule mentioned above. At a point, I thought my regular expression is not good enough and changed it: Old regex: [oO][uU]=[^,]* New regex: [oO][uU]=[^,\s]* I was getting prepared to commit my cod...

Fluent Interface Example in an Enterprise Integration Project

While working on an enterprise integration project about virtual bank payments, I utilized a simple fluent interface approach. The purpose of the code is creating strongly typed objects from a generic SMO (ServiceMessageObject) instance. Note: In the context of IBM integration technologies, ServiceMessageObject represents the “message”. In our example, it represents a Web Service request. Old Code: if (paymentInfo.getDataObject("totalAmount") != null) { totalAmount = paymentInfo.getDataObject("totalAmount"); DataObject totalAmount2 = totalAmount.getDataObject("totalAmount"); if (totalAmount2.getBigDecimal("amount") != null) { parameters.setAmount(totalAmount2.getBigDecimal("amount")); } String currencyCode = totalAmount2.getString("currencyCode"); parameters.setCurrencyCode(currencyCode); } Byte numberOfInstallments = paymentInfo.getByte("numberOfInstallments"); if (numberOfInstallments !...

Popular posts from this blog

The WeakReference class, monitoring memory leak and garbage collection in a Java application

Simplescalar Simulator - Part 2: sim-outorder.c

Notes on Java Performance