/perfj

PerfJ is a wrapper of linux perf for java programs.

Primary LanguageJavaGNU General Public License v2.0GPL-2.0

PerfJ

Join the chat at https://gitter.im/coderplay/perfj

PerfJ is a wrapper of linux perf for java programs.

In order to profile java programs, you need a profiler that can sample stack traces. There has historically been two types of profilers:

  • System profilers: like Linux perf, which shows system code paths (eg, JVM GC, syscalls, TCP), but not Java methods.
  • JVM profilers: like hprof, LJP, and commercial profilers. These show Java methods, but usually not system code paths.

Ideally, we need a profile result that does it all: system and Java code paths. Apart from convenience, it also shows system code-paths in Java context, which can be crucial for understanding a profile properly.

The problem is getting a system profiler to understand Java methods and stack traces. If you try Linux perf_events, for example, you'll see hexadecimal numbers and broken stack traces, as it can't convert addresses into Java symbols, and can't walk the JVM stack.

There are two specific problems:

  • The JVM compiles methods on the fly (just-in-time: JIT), and doesn't expose a traditional symbol table for system profilers to read.
  • The JVM also uses the frame pointer register (RBP on x86-64) as a general purpose register, breaking traditional stack walking.

Thanks to Brendan Gregg's patch. We will have an option to turn on the preservation of frame pointer on JDK 8u60+.

This project is based on Johannes Rudolph's work at here. I just make it more convenient to use.

PerfJ can produce flame graph through Brendan Gregg's FlameGraph tool as well.

Below is an example shows the hotspot of a pure java leveldb program. Green is Java layer, yellow is JVM layer, and red is system layer(native user-level, or kernel). Longer bar means higher cpu percentage.

PerfJ CPU Flame Graph Example

There is a raw interactive SVG image [here] (http://blog.minzhou.info/perfj/perfj.svg).

Prerequisites

  • Linux x86_64
  • perf
  • JDK 8u60+ / JDK9 ( haven't been released yet, however, there is an Early Access Release)

Build

Before starting building PerfJ, make sure gcc is already installed.

checkout the source from github

git clone https://github.com/coderplay/perfj.git

and run below in the future building

cd perfj
./gradlew releaseTarGz

Installation

Before install PerfJ, you should install Linux perf first

To install perf on centos/redhat/fedora linux system

yum install perf.x86_64

To install perf on for ubuntu linux system

apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`

then download perfj-*.tgz from the [release page] (https://github.com/coderplay/perfj/releases), untar it

tar zxvf perf-*.tgz

Usage

Check the [wiki pages] (https://github.com/coderplay/perfj/wiki)

License

This library is licensed under GPLv2. See the LICENSE file.