• Java性能调优:利用JFR生成性能日志


    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻。

    好的分析工具能起到事半功倍的效果,利用分析利器JMC、JFR,可以实现性能问题的准确定位。

    本文主要阐述如何利用JFR生成性能日志

    JMC:Java Mission Control

    JFR:Java Flight Recorder

    1. 打开JFR

    JVM_OPT中添加:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"

    2. 启动JFR

    登陆服务器,找到应用PID,执行命令:jcmd $PID JFR.start name=abc,duration=120s

    3. Dump JFR

    等待至少duration(本文设定120s)后,执行命令:jcmd $PID JFR.dump name=abc,duration=120s filename=abc.jfr(注意,文件名必须为.jfr后缀)

    4. 检查JFR状态

    执行命令:jcmd $PID JFR.check name=abc,duration=120s

    5. 停止JFR

    执行命令:jcmd $PID JFR.stop name=abc,duration=120s

    6. JMC分析

    切回开发机器,下载步骤3中生成的abc.jfr,打开jmc,导入abc.jfr即可进行可视化分析

    ==================================================================================

    另一种配置方法, 已经成功:

    java 参数  -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:NativeMemoryTracking=summary -XX:FlightRecorderOptions=defaultrecording=true

    sudo -utomcat jcmd 8588 JFR.start settings=/tmp/my-profiling.jfc duration=6m filename=/tmp/hsperfdata_tomcat/new2.jfr
       

    my-profiling.jfc 这个是模板文件, 内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration version="1.0" name="my-profiling" description="Low overhead configuration for profiling, typically around 2 % overhead." provider="Oracle">

      <producer uri="http://www.oracle.com/hotspot/jvm/" label="Oracle JDK">

        <control>

          <selection name="gc-level" default="detailed" label="Garbage Collector">
            <option label="Off" name="off">off</option>
            <option label="Normal" name="detailed">normal</option>
            <option label="All" name="all">all</option>
          </selection>

          <condition name="gc-enabled-normal" true="true" false="false">
            <or>
              <test name="gc-level" operator="equal" value="normal"/>
              <test name="gc-level" operator="equal" value="all"/>
            </or>
          </condition>

          <condition name="gc-enabled-all" true="true" false="false">
            <test name="gc-level" operator="equal" value="all"/>
          </condition>

          <selection name="compiler-level" default="detailed" label="Compiler">
            <option label="Off" name="off">off</option>
            <option label="Normal" name="normal">normal</option>
            <option label="Detailed" name="detailed">detailed</option>
            <option label="All" name="all">all</option>
          </selection>

          <condition name="compiler-enabled" true="false" false="true">
            <test name="compiler-level" operator="equal" value="off"/>
          </condition>

          <condition name="compiler-enabled-failure" true="true" false="false">
            <or>
              <test name="compiler-level" operator="equal" value="detailed"/>
              <test name="compiler-level" operator="equal" value="all"/>
            </or>
          </condition>

          <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
            <test name="compiler-level" operator="equal" value="all"/>
          </condition>

          <condition name="compiler-compilation-threshold" true="1000 ms">
            <test name="compiler-level" operator="equal" value="normal"/>
          </condition>

          <condition name="compiler-compilation-threshold" true="100 ms">
            <test name="compiler-level" operator="equal" value="detailed"/>
          </condition>

          <condition name="compiler-compilation-threshold" true="0 ms">
            <test name="compiler-level" operator="equal" value="all"/>
          </condition>

          <condition name="compiler-phase-threshold" true="60 s">
            <test name="compiler-level" operator="equal" value="normal"/>
          </condition>

          <condition name="compiler-phase-threshold" true="10 s">
            <test name="compiler-level" operator="equal" value="detailed"/>
          </condition>

          <condition name="compiler-phase-threshold" true="0 s">
            <test name="compiler-level" operator="equal" value="all"/>
          </condition>

          <selection name="method-sampling-interval" default="maximum" label="Method Sampling">
            <option label="Off" name="off">999 d</option>
            <option label="Normal" name="normal">20 ms</option>
            <option label="Maximum" name="maximum">10 ms</option>
          </selection>

          <condition name="method-sampling-enabled" true="false" false="true">
            <test name="method-sampling-interval" operator="equal" value="999 d"/>
          </condition>

          <selection name="thread-dump-interval" default="everyMinute" label="Thread Dump">
            <option label="Off" name="off">999 d</option>
            <option label="At least Once" name="normal">everyChunk</option>
            <option label="Every 60 s" name="everyMinute">60 s</option>
            <option label="Every 10 s" name="everyTenSecond">10 s</option>
            <option label="Every 1 s" name="everySecond">1 s</option>
          </selection>

          <condition name="thread-dump-enabled" true="false" false="true">
            <test name="thread-dump-interval" operator="equal" value="999 d"/>
          </condition>

          <selection name="exception-level" default="errors" label="Exceptions">
            <option label="Off" name="off">off</option>
            <option label="Errors Only" name="errors">errors</option>
            <option label="All Exceptions, including Errors" name="all">all</option>
          </selection>

          <condition name="enable-errors" true="true" false="false">
            <or>
              <test name="exception-level" operator="equal" value="errors"/>
              <test name="exception-level" operator="equal" value="all"/>
            </or>
          </condition>

          <condition name="enable-exceptions" true="true" false="false">
            <test name="exception-level" operator="equal" value="all"/>
          </condition>

          <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">10 ms</text>

          <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>

          <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>

          <flag name="heap-statistics-enabled" label="Heap Statistics">false</flag>

          <flag name="class-loading-enabled" label="Class Loading">true</flag>

          <flag name="allocation-profiling-enabled" label="Allocation Profiling">true</flag>

        </control>

        <event path="java/statistics/thread_allocation">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="java/statistics/class_loading">
          <setting name="enabled">true</setting>
          <setting name="period">1000 ms</setting>
        </event>

        <event path="java/statistics/threads">
          <setting name="enabled">true</setting>
          <setting name="period">1000 ms</setting>
        </event>

        <event path="java/thread_start">
          <setting name="enabled">true</setting>
        </event>

        <event path="java/thread_end">
          <setting name="enabled">true</setting>
        </event>

        <event path="java/thread_sleep">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="synchronization-threshold">10 ms</setting>
        </event>

        <event path="java/thread_park">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="synchronization-threshold">10 ms</setting>
        </event>

        <event path="java/monitor_enter">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="synchronization-threshold">10 ms</setting>
        </event>

        <event path="java/monitor_wait">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="synchronization-threshold">10 ms</setting>
        </event>

        <event path="vm/class/load">
          <setting name="enabled" control="class-loading-enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/class/unload">
          <setting name="enabled" control="class-loading-enabled">true</setting>
        </event>

        <event path="vm/info">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/initial_system_property">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/prof/execution_sample">
          <setting name="enabled" control="method-sampling-enabled">true</setting>
          <setting name="period" control="method-sampling-interval">10 ms</setting>
        </event>

        <event path="vm/prof/execution_sampling_info">
          <setting name="enabled">false</setting>
          <setting name="threshold">1 ms</setting>
        </event>

        <event path="vm/runtime/execute_vm_operation">
          <setting name="enabled">true</setting>
          <setting name="threshold">10 ms</setting>
        </event>

        <event path="vm/runtime/thread_dump">
          <setting name="enabled" control="thread-dump-enabled">true</setting>
          <setting name="period" control="thread-dump-interval">60 s</setting>
        </event>

        <event path="vm/flag/long">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/flag/ulong">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/flag/double">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/flag/boolean">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/flag/string">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/flag/long_changed">
          <setting name="enabled">true</setting>
        </event>

        <event path="vm/flag/ulong_changed">
          <setting name="enabled">true</setting>
        </event>

        <event path="vm/flag/double_changed">
          <setting name="enabled">true</setting>
        </event>

        <event path="vm/flag/boolean_changed">
          <setting name="enabled">true</setting>
        </event>

        <event path="vm/flag/string_changed">
          <setting name="enabled">true</setting>
        </event>

        <event path="vm/gc/detailed/object_count">
          <setting name="enabled" control="heap-statistics-enabled">false</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/configuration/gc">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/configuration/heap">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/configuration/young_generation">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/configuration/tlab">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/configuration/survivor">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/gc/detailed/object_count_after_gc">
          <setting name="enabled">false</setting>
        </event>

        <event path="vm/gc/heap/summary">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/heap/ps_summary">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/heap/metaspace_summary">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/metaspace/gc_threshold">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/metaspace/allocation_failure">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="vm/gc/metaspace/out_of_memory">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="vm/gc/metaspace/chunk_free_list_summary">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/collector/garbage_collection">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/collector/parold_garbage_collection">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/collector/young_garbage_collection">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/collector/old_garbage_collection">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/collector/g1_garbage_collection">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/phases/pause">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/phases/pause_level_1">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/phases/pause_level_2">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/phases/pause_level_3">
          <setting name="enabled" control="gc-enabled-all">false</setting>
          <setting name="threshold">0 ms</setting>
        </event>

        <event path="vm/gc/reference/statistics">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/detailed/promotion_failed">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/detailed/evacuation_failed">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/detailed/evacuation_info">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/detailed/concurrent_mode_failure">
          <setting name="enabled" control="gc-enabled-normal">true</setting>
        </event>

        <event path="vm/gc/detailed/allocation_requiring_gc">
          <setting name="enabled" control="gc-enabled-all">false</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="vm/compiler/config">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/compiler/stats">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">1000 ms</setting>
        </event>

        <event path="vm/compiler/compilation">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="threshold" control="compiler-compilation-threshold">100 ms</setting>
        </event>

        <event path="vm/compiler/phase">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="threshold" control="compiler-phase-threshold">10 s</setting>
        </event>

        <event path="vm/compiler/failure">
          <setting name="enabled" control="compiler-enabled-failure">true</setting>
        </event>

        <event path="vm/code_sweeper/config">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/code_sweeper/stats">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/code_sweeper/sweep">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="threshold" control="compiler-sweeper-threshold">100 ms</setting>
        </event>

        <event path="vm/code_cache/config">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/code_cache/stats">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="vm/code_cache/full">
          <setting name="enabled" control="compiler-enabled">true</setting>
        </event>

        <event path="os/information">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="os/processor/cpu_information">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="os/processor/context_switch_rate">
          <setting name="enabled" control="compiler-enabled">true</setting>
          <setting name="period">10 s</setting>
        </event>

        <event path="os/processor/cpu_load">
          <setting name="enabled">true</setting>
          <setting name="period">1000 ms</setting>
        </event>

        <event path="os/processor/cpu_tsc">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="os/system_process">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="os/initial_environment_variable">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="os/memory/physical_memory">
          <setting name="enabled">true</setting>
          <setting name="period">everyChunk</setting>
        </event>

        <event path="java/object_alloc_in_new_TLAB">
          <setting name="enabled" control="allocation-profiling-enabled">true</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="java/object_alloc_outside_TLAB">
          <setting name="enabled" control="allocation-profiling-enabled">true</setting>
          <setting name="stackTrace">true</setting>
        </event>

      </producer>

      <producer uri="http://www.oracle.com/hotspot/jdk/" label="Oracle JDK">

        <event path="java/file_read">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
        </event>

        <event path="java/file_write">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
        </event>

        <event path="java/socket_read">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
        </event>

        <event path="java/socket_write">
          <setting name="enabled">true</setting>
          <setting name="stackTrace">true</setting>
          <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
        </event>

        <event path="java/exception_throw">
          <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">false</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="java/error_throw">
          <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-errors">true</setting>
          <setting name="stackTrace">true</setting>
        </event>

        <event path="java/statistics/throwables">
          <setting name="enabled">true</setting>
          <setting name="period">1000 ms</setting>
        </event>

      </producer>

      <producer uri="http://www.oracle.com/hotspot/jfr-info/" label="Oracle JDK">

        <event path="recordings/recording">
          <setting name="enabled">true</setting>
        </event>

        <event path="recordings/recording_setting">
          <setting name="enabled">true</setting>
        </event>

      </producer>

    </configuration>

  • 相关阅读:
    [译] 我最终是怎么玩转了 Vue 的作用域插槽
    通俗易懂的Git使用入门教程
    JS取出两个数组的不同或相同元素
    jQuery中四种事件监听的区别
    vuex里mapState,mapGetters使用详解
    php 获取时间今天明天昨天时间戳
    Linux crontab定时执行任务
    php返回json数据函数实例_php技巧_脚本之家
    mysql查看表结构命令
    Mysql命令大全
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/8312730.html
Copyright © 2020-2023  润新知