JVM

Understanding Java Buffer Pool

The buffer pool space is located outside of the garbage collector-managed memory. It’s a way to allocate native off-heap memory. What’s the benefit of using buffer pools? To answer this question, let’s firstly learn what byte buffers are.   Byte Buffer Non-Direct Buffer java.nio package comes with the ByteBuffer class. It allows us to allocate both direct…

Read more...
JVM

Profiling in Production

If you ever had some serious issues with a performance of your Java application, most probably you know how valuable thread profiling can be. But do you know which profiler you should use?   There are two basic techniques used by profilers – sampling and instrumentation.   Sampling Profilers A sampling profiler involves periodically asking…

Read more...

Big-O Ambiguity

Back to University Most people talk about Big-O notation when it comes to runtime and space complexity. But when you recall your first year at university, most probably you had Algorithm and Data Structure course when you have learned not only Big-O notation, but also Big-Ω (Omega) and Big-Θ (Theta). Here is a very brief definition:  …

Read more...

Ring Buffer – a Data Structure Behind Disruptor

Disruptor is a high-performance library for passing messages between threads, developed and open sourced some years ago by LMAX Exchange company.  They created this piece of software to handle an enormous traffic (more than 6 million TPS) in their retail financial trading platform. In 2010 they surprised everyone how fast their system can be by…

Read more...

A Tale of Two Iterators

When you look at the most popular Java interview questions, you might encounter the one about fail-fast and fail-safe iterators: What’s the difference between fail-fast and fail-safe iterators? The simplified answer is that: Fail-fast iterator throws ConcurrentModificationException if the collection is modified while iterating, but fail-safe doesn’t. Even though it totally makes sense, it’s not…

Read more...

Tail-Tolerance by Google

Recently, I have read an interesting paper entitled “The Tail at Scale” written by two experts from Google: Jeff Dean and Luiz Barroso. The authors defined what the latency tail-tolerant system is and how to implement it.   Tail Latency What is Tail Latency? In the paper, the authors provide an example of the system where…

Read more...
gc

When Throughput Matters – Parallel GC

As I mentioned in one of the previous posts, Parallel Collector is also called Throughput Collector, because its main goal is to maximize overall throughput of the application. The two basic operations that Parallel Collector performs are Minor GC and Full GC. These are pretty straightforward.   Minor GC When Eden fills up, the young…

Read more...
gc

User, Sys and Real Times in GC Log

Have you ever wondered what user, sys and real times in a GC log mean? Well, I have, a couple of times at least. Let’s say that we have the following line after Full GC entry: [Times: user=4.21 sys=0.03, real=0.75 secs] To find out what they represent, we should check UNIX command time first. time…

Read more...
gc

GC Algorithms

As described in the previous post, we have four different garbage collectors available in HotSpot JVM. There are some significant differences between them, but the actual concepts behind the algorithms which are used to do the actual job are quite similar. In this short post, I will try to explain three basic algorithms: Mark-sweep Mark-sweep-compact…

Read more...
JVM

Why Server If It’s Not a Server?

Have you ever wondered why when you type java -version, you usually get something like that: java version “1.8.0_131” Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)   Why Server VM? For JVM, some machines are considered to be “client-class” and some are “server-class”. If the given machine…

Read more...