New in version 2013 Build 13072

February 1st, 2014
  • UI: bug fixed: sporadic "java.lang.ClassCastException"
  • UI: deadlock detector: bug fixed: possible "deadlock detector problem: status mismatch" exceptions for some inputs
  • Agent: bug fixed: IBM Java: "java.lang.UnsatisfiedLinkError" for native methods in com.ibm.oti.vm.VM

New in version 2013 Build 13070 (January 25th, 2014)

  • Agent: Linux: bug fixed: incorrect session name was chosen in case of very long command line, e.g. 'java' instead of the main class or JAR name
  • Agent: bug fixed: startup options probe_on, probe_off, probe_auto, probe_disable didn't accept the short syntax for built-in probes, e.g. .Databases for com.yourkit.probes.builtin.Databases
  • Agent: probes, performance counters: bug fixed: FileOutputStream and process I/O events were not recorded in some Java versions
  • IDE integration: NetBeans 8.0 Beta supported
  • IDE integration: Mac OS X: bug fixed: the profiler UI wouldn't automatically connect to the profiled process due to Java 7's JavaAppLauncher's inability to pass its command line parameters to java executable

New in version 2013 Build 13066 (January 9th, 2014)

  • CPU Profiling:
  • Snapshot comparison: improvement: slave views "Back traces", "Callees list" and "Merged Callees" have been added for a method selected in the "Method list". They are especially useful when analysing a method called from different places in the snapshots being compared.
  • J2EE high-level profiling is now based on built-in probe results.
  • This eliminates overhead of previously used dedicated callbacks, which partially repeated the built-in probe functionality, as well as performed some operations in runtime instead of performing them when the profiler opens a snapshot.
  • The property high_level_cpu_profiling no longer exists in CPU sampling or tracing settings. The startup option disablej2ee has been removed. To turn J2EE high-level profiling off, you should turn off or disable corresponding probes.
  • CPU tracing: a new startup option _instrument_all_methods has been added to instrument primitive getters, setters and other similar short methods which only access object fields and/or return a value. By default, such methods are not instrumented to reduce overhead. Use this option when invocation counts for all called methods are more valuable than the time accuracy and lower overhead.
  • UI: added ability to show methods that took less than 1 ms by specifying -Dyjp.show.shortest.methods=true in /bin/yjp.ini
  • Optimization: Hot Spots view opens much faster
  • UI: added ability to disable the zero-time method correction with the help of the property -Dyjp.zero.time.methods=false in /bin/yjp.ini. The zero-time correction means that any calls to the following methods are ignored:
  • java.lang.Object : wait(*)
  • java.lang.Thread : sleep(*)
  • java.lang.Thread : yield(*)
  • java.net.PlainSocketImpl : socketAccept(*)
  • java.net.PlainSocketImpl : accept(*)
  • java.net.ServerSocket : accept()
  • org.apache.tomcat.jni.Socket : accept(*)
  • sun.nio.ch.ServerSocketChannelImpl : accept0(*)
  • sun.misc.Unsafe : park(*)
  • java.util.concurrent.locks.LockSupport : park*(*)
  • com.ibm.tools.attach.javaSE.IPC : waitSemaphore(*)
  • sun.nio.ch.EPollArrayWrapper : epollWait(*)
  • Technically, their time is subtracted from the caller time up to the call tree root when CPU profiling results are loaded in UI. In other words, their time is always assumed to be 0 when the correction is applied.
  • Memory Profiling:
  • Object explorer: values are immediately shown for objects of the following classes:
  • java.util.Date
  • java.net.URL
  • java.io.File
  • java.util.zip.ZipFile
  • java.util.jar.JarFile
  • primitive value wrappers:
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Short
  • java.lang.Boolean
  • java.lang.Byte
  • java.lang.Character
  • java.lang.Double
  • java.lang.Float
  • atomic values:
  • java.util.concurrent.atomic.AtomicInteger
  • java.util.concurrent.atomic.AtomicLong
  • java.util.concurrent.atomic.AtomicBoolean
  • other numeric classes:
  • java.math.BigDecimal
  • java.math.BigInteger
  • reflection:
  • java.lang.reflect.Field
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • (since build 13062) collection size for collection classes and their subclasses:
  • java.util.ArrayList
  • java.util.Arrays$ArrayList (returned from Arrays.asList())
  • java.util.HashMap
  • java.util.HashSet
  • java.util.Hashtable
  • java.util.IdentityHashMap
  • java.util.LinkedList
  • java.util.PriorityQueue
  • java.util.TreeMap
  • java.util.Vector
  • java.util.WeakHashMap
  • Object explorer: self referencing objects are explicitly indicated with [Self reference], and corresponding tree nodes are leafs now to avoid infinite expansion
  • Object explorer: added ability to customize the maximum number of shown individual objects with the help of the property -Dyjp.max.objects.to.show= in /bin/yjp.ini. The default value remains 500. Note: setting bigger values increases memory usage and can slow down the UI.
  • Primitive arrays with all the same elements are explicitly indicated in object explorer, paths and other views presenting individual objects
  • Analysis of arrays with a big number of elements has been simplified with the help of the new action Memory | View Array Elements (Shift+F5) (also accessible via a popup menu) which opens all elements of selected reference array(s) in a new tab, where they can be comprehensively examined with all available views.
  • This action is also available as the "Open all elements in a new tab" hyperlink in the object explorer in addition to the "Configure shown array element range..." hyperlink available for the arrays with hidden elements.
  • Merged paths: improvement: separate nodes are used for GC roots and objects retained from multiple objects
  • Merged paths: improvement: "

New in version 12.0.5 (April 30th, 2013)

  • The agent log file could not be created if the session name contained invalid file name characters.

New in version 12.0.4 (April 13th, 2013)

  • This version fixes sampled allocation recording, which might crash the profiled application if CPU sampling had never been started.
  • The bundled JRE has been upgraded to Java 7.

New in version 12.0.3 (February 21st, 2013)

  • Support for FreeBSD 8 has improved.
  • Loading of snapshots with a large amount of GC is greatly optimized.
  • This release solves some issues with JBoss, GlassFish, and OSGI Felix.

New in version 12.0.1 (December 14th, 2012)

  • 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 Profiling:
  • 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)
  • CPU tracing now measures wall time by default (see CPU tracing settings and time measurement).
  • 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
  • All CPU profiling settings applied in runtime are configured in CPU sampling settings and CPU tracing settings
  • Please note the related changes:
  • API: two new Controller methods 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
  • startup option noj2ee has been removed in favor of the high_level_cpu_profiling property in CPU sampling settings and CPU tracing settings
  • startup options samplingperiod and samplingdelta have been removed in favor of the sampling_period_ms and sampling_period_delta_ms properties in CPU sampling settings
  • time measurement is now configured in CPU sampling settings and CPU tracing settings. A separate configuration file .walltime and a dedicated startup option walltimespec are not used anymore.
  • startup option filters has been removed in favor of CPU tracing settings
  • 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
  • CPU sampling: bug fixed: native method wrappers $$YJP$$ might appear in the stacks
  • Memory Profiling:
  • UI: new feature: 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
  • Generations
  • 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 applications: improvement: 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
  • Telemetry:
  • 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: clock_gettime(CLOCK_PROCESS_CPUTIME_ID) and 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 _with_rusage to use rusage() instead.
  • 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
  • Probes:
  • 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 Controller.clearUserTables(String... tableNames)
  • 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.
  • Class loading probe can be enabled with startup option probe=classloading (the default) and disabled with startup option noprobe=classloading. Startup option builtinprobes=none now implies noprobe=classloading.
  • Probes: API: deprecated class com.yourkit.probes.ObjectIntWeakMap has been removed. Use com.yourkit.probes.ObjectRowIndexMap instead.
  • "Thread Life Cycle" built-in probe: bug fixed: name change events were incorrectly associated for a few JVM internal threads
  • Triggers:
  • the default triggers description file has been changed to /.yjp/triggers.txt
  • IDE Integration:
  • 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:
  • J2EE integration wizard: added Jetty 6 and newer support
  • User Interface
  • 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.
  • Filters: 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
  • Scalability: 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 frames in /bin/yjp.ini.
  • Added support of high-contrast color schemes. To use it, please specify -Dyjp.system.colors=true in /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
  • Miscellaneous:
  • Export with command line: class list is exported for performance snapshots too (as seen in Memory tab | Class list)
  • Caveat: snapshot directory configuration file is now /.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 -.log to 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 ..log instead of creating an individual log file -.log for 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 united_log
  • 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 sessionname=
  • Running number starts with 1. If the first log file .1.log exceeds the size limit, a new log file .2.log will be created and used, then .3.log etc. The size limit is 1 MB by default, and can be changed with the startup option log_file_size_limit=
  • 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
  • Agent: bug fixed: possible java.lang.VerifyError: Inconsistent stackmap frames at branch target for 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

New in version 10.0 (September 27th, 2011)

  • This new major release contains a lot of new features, improvements, and bugfixes. Support of AIX (ppc and ppc64) platform was added.
  • A new "triggers" feature allows users to automatically perform different actions on particular events (high CPU or memory usage, execution of method, etc.).
  • Allocation recording can gather the garbage collector statistics per class.
  • Performance snapshots can be extracted from memory snapshots.
  • Calibration accuracy of CPU tracing was improved.
  • CPU usage and time spent in garbage collector are now shown on the same graph.
  • As usual, many improvements to the UI were implemented.

New in version 9.5.1 (November 16th, 2010)

  • Improvement: more OSGi container applications can be profiled without the need to manually twick OSGi settings to allow loading of the profiler classes. In particular, this includes GlassFish 3.1.
  • IDE integration: improved NetBeans plugin installation on Windows Vista and Windows 7. Previously, the IDE integration wizard might fail if NetBeans was installed in a protected directory such as "Program Files" due to Windows's User Access Control (UAC). Now, appropriate UAC prompt is shown when necessary, letting the wizard succeed.
  • IDE integration: NetBeans 7.0 M2 supported
  • IDE integration: profiler plugin UI: improvements
  • UI: Welcome screen: improved usability on low resolution screens
  • UI: open snapshot dialog: grouping snapshots by session is now optional
  • Bug fixed: UI: open snapshot dialog might improperly refresh under certain rare circumstances