Method Profiling and Lock Contention Profiling on the Java Virtual Machine Level

Peter Hofer


Abstract

Large-scale software systems are frequently distributed over a network of computers in different locations, commonly rely on virtualization, and are often used by thousands of users at the same time. Application Performance Management (APM) software is used to continuously monitor such software systems. It uses profiling approaches to collect real-world performance data that can be used to identify and understand performance problems. However, unlike profiling tools, APM software must incur only minimal runtime overhead while still collecting sufficiently detailed performance data.

In order to address these challenges for Java, we propose a Java virtual machine implementation with sophisticated built-in profiling mechanisms. By integrating with the virtual machine, these mechanisms can efficiently collect accurate performance data. First, we propose new approaches for sampling-based method profiling, which attribute execution time to method calls. Inside the virtual machine, our approaches can directly decode and manipulate call stacks and can control how threads are paused to capture their states. Second, we propose a novel approach for lock contention profiling, which reveals concurrency issues that cause threads to wait for each other. Our approach integrates with the low-level implementation of locking in the virtual machine to efficiently collect accurate data while avoiding side effects. Finally, we propose a new approach to quantify effects of virtualization, which can misrepresent the resource usage of threads.

We implemented our approaches in the HotSpot Virtual Machine, a production-quality, high-performance Java virtual machine implementation. We evaluate our approaches using benchmarks with non-trivial, real-world workloads and demonstrate their efficiency and the accuracy of the data which they collect.

Kurzfassung

Große Softwaresysteme sind oft auf ein Netzwerk von Computern an unterschiedlichen Orten verteilt, nutzen häufig Virtualisierung und werden oft von tausenden Benutzern gleichzeitig verwendet. Software für Application Performance Management (APM) wird verwendet, um solche Softwaresysteme fortlaufend im Echtbetrieb zu überwachen. APM-Software verwendet Profiling-Ansätze, um Daten zu sammeln, mit welchen Leistungsprobleme identifiziert und nachvollzogen werden können. Anders als Profiling- Werkzeuge darf APM-Software allerdings nur minimale Auswirkungen auf die Leistung haben und muss dennoch hinreichend detaillierte Daten sammeln.

Um diese Anforderungen für Java-Software zu bewältigen, schlagen wir die Integration von hochentwickelten Profiling-Mechanismen in eine virtuelle Maschine für Java vor. Durch diese Integration können solche Mechanismen effizient arbeiten und genaue Daten sammeln. Zunächst zeigen wir neue Ansätze für stichprobenbasiertes Methoden-Profiling, welche die Ausführungszeit den einzelnen Methoden zuordnen. Innerhalb der virtuellen Maschine können unsere Ansätze direkt Methoden-Stacks dekodieren, ändern, und auch beeinflussen, wie Threads zum Erfassen ihres Zustands pausiert werden.Weiters präsentieren wir einen neuen Ansatz für Lock Contention Profiling, welcher Concurrency- Probleme aufzeigt, durch die Threads aufeinander warten müssen. Unser Ansatz ist in die Implementierung von Locks in der virtuellen Maschine integriert, wodurch er effizient genaue Daten sammelt, aber Nebeneffekte vermeidet. Schließlich zeigen wir einen neuen Ansatz, um Auswirkungen von Virtualisierung zu messen, welche die Ressourcennutzung von Threads verfälschen können.

Wir haben unsere Ansätze in der HotSpot Virtual Machine implementiert, einer ausgereiften und leistungsfähigen Implementierung einer virtuellen Maschine für Java.Wir evaluieren unsere Ansätze anhand von Benchmarks mit nicht-trivialen, realitätsnahen Abläufen und zeigen ihre Effizienz und die Genauigkeit ihrer gesammelten Daten.


PhD thesis, Johannes Kepler University Linz, Oktober 2016

Download als pdf