转自 https://www.infoq.com/news/2015/08/JVM-Option-mixed-mode-profiles

Java has added a new launch option “-XX:+PreserveFramePointer” in JDK versions 8 and 9, that enables generation of mixed-mode flame graphs.

Flame graphs visually present the data gathered by performance profilers, tools used by developers for performance tuning their applications. In the past, Java developers had to use system profilers such as perf command in Linux, together with JVM profilers such as hprof, to get the full picture of their application performance.

System profilers only trace system code paths, whereas JVM profilers trace only the Java code paths. Netflix performance engineers Brendan Gregg and Martin Spier note that it is desirable for profilers to sample system as well as Java code paths:

To understand all types of CPU consumers, we previously used both types of profilers, creating a flame graph for each. This worked – sort of. While all CPU consumers could be seen, Java methods were missing from the system profile, which was crucial context we needed. Ideally, we would have one flame graph that shows it all: system and Java code together.

The reason profilers could not generate “mixed-mode” profiles (i.e., profile information from both system code path and Java code paths)  was a result  of how JVM Just In Time (JIT) compilers were implemented.

To understand this, we need to know that the operating system maintains layers of system calls in a “stack frame”. For example, on x86 machines, the most recent call of the stack frame is referenced by the frame pointer register. System profilers traverse the call stack of the process for profiling, and fetch details from the frame pointer register. Compilers and virtual machines (including the JVM JIT implementations) targeting x86 machines often calculate the offset from the stack pointer and hence they don't need to use the frame pointer register. They instead use the frame pointer as a general purpose register as an optimization. However, this optimization by the JVM JIT implementations break the ability of the profiling tools to traverse the stack and fetch call details.

To support mixed-mode profilers, the JVM has added support for the “-XX:+PreserveFramePointer” option. When this option is supplied, the JVM will abide by the frame pointer intended semantics and not use it as a general purpose register. Because this option disables a compiler optimization, there could be a small performance hit when this option is turned on.  However, since this option is disabled by default, there is no performance impact for the default configuration of the JVM.

Brendan’s original post on the OpenJDK mailing list provides details of the patch for hotspot JVM.

InfoQ spoke to Brendan about the flame graphs and the new JDK option.

InfoQ: Does the new JDK option: -XX:+PreserveFramePointer help tools other than profilers, such as debuggers?

Brendan: This can make a difference for any debugger or profiler which uses frame pointers as a stack walking method, which is the traditional technique, e.g., gdb.

InfoQ: The Java bug issue supporting this option describes potential performance hit when this option is enabled. Can you elaborate on that?

Brendan: The performance hit should be small: between 0 and 3% depending on the workload. Microbenchmarks that run tight code may hurt more from lacking an extra register for compiler optimizations; whereas real world workloads should hurt less.

The performance hit was much larger in the past. x86 had fewer registers, so by freeing up a register helped more. There were also pipeline stall issues with managing the frame pointer. Both of these problems are much less of a concern with most modern processors.

InfoQ: Can you please share a sample mixed-mode flame graph that was generated with the help of this Java option?

Brendan: I think this is a nice example, and well understood.

With this JVM enhancement, Java developers can now run profilers and generate flame graphs that visualize both system code paths and Java code paths.

The FlameGraph project, which provides flame graph functionality externally, is available as a free download from GitHub. Developers can also download JDK 8(OpenJDK 8u60 - update 60 build 19) and Java 9 early access releases that support the “-XX:+PreserveFramePointer” option.

New JVM Option Enables Generation of Mixed-Mode Flame Graphs的更多相关文章

  1. jvm.option是什么,它是如何加载的

    jvm.option是一些程序里边的java的配置参数的一个集合,不同的应用都会定义自己的jvm.options用来控制一些jvm的参数 以下,以elasticsearch为例,来说明它是如何加载的 ...

  2. JVM Guide

    Java Virtual Machine: the Essential Guide October 8th, 2014 - By Alexey Zhebel Introduction Java Vir ...

  3. Java (JVM) Memory Model – Memory Management in Java

    原文地址:http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java Understanding JV ...

  4. JVM监测&工具[转]

    通过工具及Java api来监测JVM的运行状态, 需要监测的数据:(内存使用情况 谁使用了内存 GC的状况) 内存使用情况--heap&PermGen @ 表示通过jmap –heap pi ...

  5. Java 7 jstat – JVM Statistics Monitoring Tool【翻译】

    原文地址:Java 7 jstat 本文内容 语法 参数 描述 虚拟机标识符 选项 一般选项 输出选项 示例 先发出来,然后慢慢翻译~ 语法 jstat [ generalOption | outpu ...

  6. JVM系列五:JVM监测&工具[整理中]

    前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案.正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并 ...

  7. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  8. Tomcat 部署安装及JVM调优~

    Tomcat 部署Tomcat环境 环境准备 linux: CentOS 7.3 tomcat: 9.0.0.M21 jdk: 1.8.0_131 ip: 192.168.1.5 tomcat官方下载 ...

  9. 10 Examples of HotSpot JVM Options in Java[z]

    There are hundreds of JVM parameters or JVM Options exists inside sun JDK and its virtually impossib ...

随机推荐

  1. 用js来实现银行家算法

    Number.prototype.round = function (len) { var old = this; var a1 = Math.pow(10, len) * old; a1 = Mat ...

  2. springmvc框架的搭建

    1引入jar包 jar包下载地址http://maven.springframework.org/release/org/ 以下是我引入的jar包 aopalliance-1.0.jaraspectj ...

  3. 向数据库添加学生信息。存放在REQUEST对象里

    代码前几天已经发过了,但是程序一直还没运行出来,今天重新建立了一个数据库,才可以,下面补充上数据截图

  4. 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。

    本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...

  5. 源码包的解压 .tar.gz /.tar.bz2的解压

    解压方式如下: .tar.gz     格式解压为          tar   -zxvf   xx.tar.gz .tar.bz2   格式解压为          tar   -jxvf    ...

  6. Python globals() 函数

    Python globals() 函数  Python 内置函数 描述 globals() 函数会以字典类型返回当前位置的全部全局变量. 语法 globals() 函数语法: globals() 参数 ...

  7. UVa 12100 Printer Queue(queue或者vector模拟队列)

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...

  8. python之字符串【str】

    #Auther Bob#--*--conding:utf-8 --*-- #定义一个str的对象,有下面两种方法name = 'Bob abc'job = str('it')print(type(na ...

  9. bluez蓝牙测试工具

    http://blog.csdn.net/talkxin/article/details/50610984

  10. mysql添加注释

    -- 查看字段类型-- show columns from campaign_distribute --给表添加注释 -- alter table campaign_distribute commen ...