Changes in version 12 from 11:
- New Platforms Supported
- CPU Profiling
- Memory Profiling
- IDE Integration
- J2EE Integration
- User Interface
New Platforms Supported
- Linux on ARM: running profiled applications and/or the profiler UI is supported on soft-float (ARMv5, ARMv7) and hard-float (ARMv7) JVMs
- Linux on PPC: running profiled applications and/or the profiler UI is supported on 32-bit (ppc) and 64-bit (ppc64) JVMs
CPU tracing overhead has been significantly reduced (different profiled applications run up to 10%-50% faster than with the previous profiler version) and accuracy has been increased due to the following improvements:
new adaptive tracing mode automatically reduces tracing overhead and makes the results more adequate (see CPU tracing settings)
This reduces profiling overhead because obtaining wall time is faster than obtaining CPU time.
Wall time is also more precise than CPU time, providing a few nanosecond accuracy when measuring time intervals.
- internal improvements reduced profiling overhead
Please note the related changes:
Controllermethods have been added:
startCPUTracing(@Nullable String settings)and
startCPUSampling(@Nullable String settings). Methods
startCPUProfiling(...)have been deprecated.
- J2EE high-level profiling is now configured in CPU sampling settings and CPU tracing settings
noj2eehas been removed in favor of the
high_level_cpu_profilingproperty in CPU sampling settings and CPU tracing settings
samplingdeltahave been removed in favor of the
sampling_period_delta_msproperties in CPU sampling settings
time measurement is
now configured in
CPU sampling settings and
CPU tracing settings.
A separate configuration file
.walltimeand a dedicated startup option
walltimespecare not used anymore.
filtershas been removed in favor of CPU tracing settings
- API: two new
- CPU tracing: wall time methods are no longer implicitly treated as always non-filtered. The previous behavior might create unexpected overhead if wall time measurement was configured for many or all methods.
- Agent: time measurement has been improved to ensure monotonicity when appropriate
native method wrappers
$$YJP$$<name>might appear in the stacks
Class tree view is similar to "Class list", but shows classes grouped by package
- UI: new feature: memory views such as Class list allow selection of multiple rows. This affects slave views content, as well as actions such as "View Selected Objects" and others.
"Duplicate strings" inspection:
the results are shown under a new grouping root node
which presents the total waste in all the duplicate strings
- Optimization: snapshots with big primitive arrays are opened faster
- UI: optimization: performance of "Incoming References" view has been dramatically improved
- UI: improved calculation of exact retained size in "Class list" and similar views: more items are processed per click if calculation speed allows
UI: improvement: available CPU cores are used for parallel computations in the following views:
- Class list
- Class tree
- Reachability scopes
- Class loaders
- Web applications
- Object ages
- UI: improvement: "Calculate exact retained sizes" action uses available CPU cores to perform calculation in parallel
- UI: improvement: "Calculate exact retained sizes" action does not force sorting by the retained size column if calculation is continued
- Optimization: allocation recording overhead has been reduced for multithreaded applications. How big the improvement is depends on "Record each N-th object" setting. According to tests, code being profiled runs up to 30% faster when each 10th object is recorded (the default setting), and up to 70% faster when each 100th object is recorded, comparing with the previous version
web application context path (URL) is now shown in addition to web application name
- Web applications: added support of Jetty (versions 6, 7, 8)
Class instance count telemetry ("Class List" tab), unlike other telemetry views, does not automatically periodically update. This is for performance considerations: gathering the statistics may take significant time in case of huge heaps with many objects, thus should run on demand.
Instead, it updates when:
- the "Refresh" button is pressed when the tab is visible (an explicit update)
- the "Force Garbage Collector" button is pressed when the tab is visible (it makes sense to immediately see the changes in object counts and sizes after forcing garbage collection)
- a snapshot is captured (gathering the statistics is a part of the capture)
- UI: Paths: bug fixed: duplicate path entries could be shown under certain circumstances
CPU usage telemetry: kernel CPU time is shown as a separate curve, in addition to the main user + kernel CPU time graph.
AIX note: we know two functions to measure process CPU time on AIX:
rusage(). The first one is used by default because it seems to produce better results than its counterpart. However, it has a drawback: it does not give kernel and user times separately. This means you won't see the kernel time telemetry. To enable it, specify agent startup option
- Graph rendering has been optimized, making UI much more responsive, especially when using bigger scales
- Thread state telemetry: bug fixed: telemetry samples might happen at lower rate resulting in gaps in the thread state telemetry graph
New feature: ability to clear tables. Get rid of older events you are not interested in anymore, or give space for new events if the table capacity limit has been reached.
To clear table from the UI, use "Clear table(s)..." link located in the right upper corner of the "Probes" tab.
To clear tables programmatically, use the profiler API method
UI: "Probes" tab layout has been changed to gives more vertical space for browsing event lists, and make the UI more consistent. Now tables, timeline, event call tree and CPU usage estimation tabs are located on the same level.
Hint: use navigation actions to switch between the views.
Class loading probe can be enabled
with startup option
probe=classloading(the default) and disabled with startup option
noprobe=classloading. Startup option
com.yourkit.probes.ObjectIntWeakMaphas been removed. Use
- "Thread Life Cycle" built-in probe: bug fixed: name change events were incorrectly associated for a few JVM internal threads
the default triggers description file has been changed
Eclipse, IntelliJ IDEA, NetBeans 7.0 and newer plugin automatically detects 32-bit and 64-bit JVMs.
The "Profile" action must know whether the JVM for launching the profiled application is 32-bit or 64-bit, in order to supply appropriate agent version.
Previously, the plugin fully relied on the user choice in the "32-bit or 64-bit JRE Selection" tab of the plugin configuration. A wrong choice resulted in the JVM failure
Error occurred during initialization of VM. Could not find agent library.
Now, an attempt is made to automatically detect the JVM kind by obtaining available information from the IDE. If the detection succeeds, its result overrides the user-made choice.
This makes the "Profile" action work out of the box in most cases.
Note: we retained the "32-bit or 64-bit JRE Selection" tab as a backup for the cases when the automatic detection is impossible.
- Eclipse: Maven run configurations supported in Eclipse 3.7 and newer
- IntelliJ IDEA 12 supported
- NetBeans 7.3 supported
- NetBeans: bug fixed: profiling single class or JUnit test might not work in Web projects
- J2EE integration wizard: added Jetty 6 and newer support
- Improvement: the left vertical tab group which represents opened snapshots and connected applications now tries to avoid the scroller if many tabs are opened, by shortening the tab titles. If the full tab title does not fit, it still will be accessible via a tool tip.
added a quick way to switch between applying and not applying filters in UI:
with a new main menu item
Settings | Collapse Filtered Calls
the toolbar when the profiler is connected to a running application
"Filters..." hyperlink in the Legend when working with a snapshot
- with a new main menu item
to make UI more responsive when working with huge snapshots,
"Callees list" slave view is not automatically calculated as soon as the selection in the master table changes.
Instead, calculation should be explicitly started by clicking a link.
By default, automatic calculation is performed for snapshots with less than 1,000,000
call frames (i.e. unique stacks), which covers the greatest majority of the real world snapshots.
To change the threshold, specify
-Dyjp.callees.auto.threshold=number of framesin
<Profiler Installation Directory>/bin/yjp.ini
Added support of high-contrast color schemes.
To use it, please specify
<Profiler Installation Directory>/bin/yjp.ini
- yjp.sh startup script improved: if YJP_JAVA_HOME environment variable is specified it has priory over bundled JRE and system default Java, which provides an opportunity to run the profiler UI under particular Java version without editing the startup script
- Summary: added "Command line" property to represent the full command line of the Java process
Call tree and back traces views:
added popup menu item to expand selected node down to 5 levels,
as a supplement to the existing item which expands the node fully
- Improvement: dialog style unified in respect of Help and non-closing button location
- Bug fixed: the profiler window might become invisible after profiler restart if one of previously used displays was no longer available
- Bug fixed: stack overflow exception under certain rare circumstances
- Bug fixed: file chooser invoked from Open Snapshot dialog improperly handled Enter key, when running UI on Java 7
- Export with command line: class list is exported for performance snapshots too (as seen in Memory tab | Class list)
snapshot directory configuration file is now
<UI user home>/.yjp/snapshotdir.txt
- Windows installer: the profiler is now bundled with Java 7 JRE. Note: Java 6 remains a fully supported platform.
Agent: log file name is now <session name>
.logto better separate logs from different applications
Agent: added an option to store logs from several runs of the same application in a series of log files named <session name>
.loginstead of creating an individual log file <session name>
.logfor each profiled process.
This mode can be useful when profiling applications such as servers, when having a united log is better than having a separate log for each server start.
To use this mode, specify startup option
Session name is the name of the application as seen in the profiler UI, and which is also used by default to name the application's snapshots. It is automatically chosen for particular application basing on its jar file name, or its main class name, or the custom executable name, or on the run configuration name when profiling from within IDE. The session name can also be explicitly specified with the startup option
Running number starts with 1. If the first log file <session name>
.1.logexceeds the size limit, a new log file <session name>
.2.logwill be created and used, then <session name>
.3.logetc. The size limit is 1 MB by default, and can be changed with the startup option
Note: the oldest log files are not automatically removed. If you need to clean them up, do it manually or write a script.
- Agent: Groovy 2.0 supported
- Agent: CPU tracing and allocation recoding overhead slightly reduced on IBM Java
- Agent: bug fixed: attach mode: incorrect exception handler in constructor under certain circumstances
java.lang.VerifyError: Inconsistent stackmap frames at branch targetfor particular code patterns compiled with Eclipse compiler
- UI: remote profiling: bug fixed: remote profiled applications running on different machines, configured to use the same port and started at the same time could not be simultaneously connected in the profiler UI