Optimizing Generation of Object Graphs in Java PathFinder



Similar documents
Optimizing Generation of Object Graphs in Java PathFinder

Towards a Framework for Generating Tests to Satisfy Complex Code Coverage in Java Pathfinder

Java's garbage-collected heap

Persistent Binary Search Trees

Jonathan Worthington Scarborough Linux User Group

Trace-Based and Sample-Based Profiling in Rational Application Developer

Habanero Extreme Scale Software Research Project

CSCI E 98: Managed Environments for the Execution of Programs

Java Coding Practices for Improved Application Performance

Replication on Virtual Machines

Performance Improvement In Java Application

Advanced compiler construction. General course information. Teacher & assistant. Course goals. Evaluation. Grading scheme. Michel Schinz

How to create/avoid memory leak in Java and.net? Venkat Subramaniam

CS 2112 Spring Instructions. Assignment 3 Data Structures and Web Filtering. 0.1 Grading. 0.2 Partners. 0.3 Restrictions

Java Troubleshooting and Performance

Bachelor of Games and Virtual Worlds (Programming) Subject and Course Summaries

B M C S O F T W A R E, I N C. BASIC BEST PRACTICES. Ross Cochran Principal SW Consultant

Interpreters and virtual machines. Interpreters. Interpreters. Why interpreters? Tree-based interpreters. Text-based interpreters

A Practical Method to Diagnose Memory Leaks in Java Application Alan Yu

Write Barrier Removal by Static Analysis

Whitepaper: performance of SqlBulkCopy

Introduction of Virtualization Technology to Multi-Process Model Checking

Binary Trees and Huffman Encoding Binary Search Trees

Monitoring, Tracing, Debugging (Under Construction)

C Compiler Targeting the Java Virtual Machine

Using jvmstat and visualgc to Solve Memory Management Problems

Restraining Execution Environments

Squashing the Bugs: Tools for Building Better Software

Pattern Insight Clone Detection

Compiling Object Oriented Languages. What is an Object-Oriented Programming Language? Implementation: Dynamic Binding

5. A full binary tree with n leaves contains [A] n nodes. [B] log n 2 nodes. [C] 2n 1 nodes. [D] n 2 nodes.

Cognos8 Deployment Best Practices for Performance/Scalability. Barnaby Cole Practice Lead, Technical Services

Lecture 10: Dynamic Memory Allocation 1: Into the jaws of malloc()

Garbage Collection in the Java HotSpot Virtual Machine

Can You Trust Your JVM Diagnostic Tools?

Effective Java Programming. measurement as the basis

AUTOMATED TEST GENERATION FOR SOFTWARE COMPONENTS

The Java Virtual Machine (JVM) Pat Morin COMP 3002

Binary Heap Algorithms

Job Reference Guide. SLAMD Distributed Load Generation Engine. Version 1.8.2

InvGen: An Efficient Invariant Generator

Stacks. Stacks (and Queues) Stacks. q Stack: what is it? q ADT. q Applications. q Implementation(s) CSCU9A3 1

Practical Performance Understanding the Performance of Your Application

NetBeans Profiler is an

CARAMEL: Detecting and Fixing Performance Problems That Have Non-Intrusive Fixes

Google File System. Web and scalability

Variable Base Interface

Iterators. Provides a way to access elements of an aggregate object sequentially without exposing its underlying representation.

Lecture 32: The Java Virtual Machine. The Java Virtual Machine

Monitoring Java enviroment / applications

Monitoring and Managing a JVM

Satisfiability Checking

Development Environment and Tools for Java. Brian Hughes IBM

Evaluation of Complexity of Some Programming Languages on the Travelling Salesman Problem

Hardware Acceleration for Just-In-Time Compilation on Heterogeneous Embedded Systems

J-Sim: An Integrated Environment for Simulation and Model Checking of Network Protocols

Tomcat Tuning. Mark Thomas April 2009

Glossary of Object Oriented Terms

Apache Tomcat Tuning for Production

Cloud Computing. Up until now

02 B The Java Virtual Machine

Delivering Quality in Software Performance and Scalability Testing

Trace Server: A Tool for Storing, Querying and Analyzing Execution Traces

Comp 411 Principles of Programming Languages Lecture 34 Semantics of OO Languages. Corky Cartwright Swarat Chaudhuri November 30, 20111

No no-argument constructor. No default constructor found

<Insert Picture Here> Java Application Diagnostic Expert

Chapter 8: Bags and Sets

CSE 403. Performance Profiling Marty Stepp

An Easier Way for Cross-Platform Data Acquisition Application Development

VIRTUAL LABORATORY: MULTI-STYLE CODE EDITOR

Validating Java for Safety-Critical Applications

Testing Software Product Lines Using Incremental Test Generation

Software safety - DEF-STAN 00-55

CHAPTER 4 ESSENTIAL DATA STRUCTRURES

IMPROVING PERFORMANCE OF RANDOMIZED SIGNATURE SORT USING HASHING AND BITWISE OPERATORS

: provid.ir

PART IV Performance oriented design, Performance testing, Performance tuning & Performance solutions. Outline. Performance oriented design

A Thread Monitoring System for Multithreaded Java Programs

WebSphere Performance Monitoring & Tuning For Webtop Version 5.3 on WebSphere 5.1.x

11.1 inspectit inspectit

WEBAPP PATTERN FOR APACHE TOMCAT - USER GUIDE

Experimental Evaluation of Distributed Middleware with a Virtualized Java Environment

J2EE-JAVA SYSTEM MONITORING (Wily introscope)

Oracle Corporation Proprietary and Confidential

Building Applications Using Micro Focus COBOL

MonitorExplorer: A State Exploration-Based Approach to Testing Java Monitors

Sorting revisited. Build the binary search tree: O(n^2) Traverse the binary tree: O(n) Total: O(n^2) + O(n) = O(n^2)

Departamento de Investigación. LaST: Language Study Tool. Nº 143 Edgard Lindner y Enrique Molinari Coordinación: Graciela Matich

Simplifying Storage Operations By David Strom (published 3.15 by VMware) Introduction

Transcription:

Optimizing Generation of Object Graphs in Java PathFinder Milos Gligoric, Tihomir Gvero, Steven Lauterburg, Darko Marinov, Sarfraz Khurshid JPF Workshop 1.5.8

Bugs Six Decades Ago 1947: Harvard Mark II Photo: National Museum of American History 2

Mars Polar Lander, 1999 Crashed premature shut down at 40 meters altitude Photos: JPL/NASA 3

USS Yorktown, 1997 Dead in the water for 3 hours Photo: navsource.org 4

Java PathFinder Java PathFinder (JPF) is a popular explicit-state model checker Directly checks properties of a wide range of Java programs Implements a customized Java Virtual Machine Runs on the top of the host JVM Two key operations for explicit state-space search: State backtracking: stores/restores state to backtrack the execution during the state-space exploration Control over non-deterministic choices (including thread scheduling) Traditional focus: check properties of control, such as deadlock Recent work: also check properties of data, such as acyclicity 5

Structurally Complex Data size: 9 7 root 3 11 1 5 9 13 city washington building service camera data-type accessibility public resolution 4 6 whitehouse wing picture 640 x 480 room oval-office west [city = washington [building = whitehouse [wing = west [room = oval-office]]]] [service = camera [data-type = picture [format = jpg]] [resolution = 640x480]] [accessibility = public] 6

Korat Framework Enables systematic, constraint-based testing E.g., testing on all small inputs constraint solve instances concretize tests Implements a constraint solver for imperative predicates Takes two inputs: A Java predicate that encodes constraints that represent properties of desired object graphs A bound on the size of the graph Generates all valid graphs (within the given bound) Performs a backtracking search Systematically explores the bounded space of object graphs 7

Korat in JPF Korat solver was originally developed from scratch However, it can leverage tools, such as model checkers, which support backtracking as a fundamental operation JPF has been used to generate object graphs We use JPF as an implementation engine for Korat Start with a simple instrumentation of the Java predicate Observe that a direct implementation makes generation of object graphs unnecessarily slow in JPF Explore changes (optimizations) that could speed-up Korat in JPF 8

JPF State Operations JPF uses a special representation for the state of program it checks It performs three basic kinds of operations on the state representation: Bytecode execution: manipulates the state to execute the program bytecodes State backtracking: stores/restores state to backtrack the execution during the state-space exploration State comparison: detects cycles in the state space Our changes target each of these operations 9

Outline Overview Example Korat search in JPF Optimizing Korat search in JPF Evaluation Conclusions 10

Example Korat Input A set implemented as a red-black tree public class RedBlackTree { Node root; int size; static class Node { int element; boolean color; Node left, right, parent;... } boolean repok() { if (!istree()) return false; if (!haspropercolors()) return false; if (!areelementsordered()) return false; return true; } boolean istree() { if (root == null) return size == 0; // is size correct if (root.parent!= null) return false; // incorrect parent Set<Node> visited = Factory.<Node>createSet(); visited.add(root); Queue<Node> worklist = Factory.<Node>createQueue(); worklist.add(root); while (!worklist.isempty()) { Node current = worklist.remove(); if (current.left!= null) { if (!visited.add(current.left)) return false; // not a tree if (current.left.parent!= current) return false; // incorrect parent worklist.add(current.left); }... // analogous for current.right } return visited.size() == size; // is size correct }... 11 }

Korat Input and Output Input: Method repok checks whether an object graph indeed represents a valid red-black tree Finitization provides: A bound for the number of objects of each class in one graph, e.g., number N of Node objects A set of values for each field of those objects E.g., root, left, right, and parent are either null or point to one of the N Node objects Output: Enumeration of all valid non-isomorphic object graphs, within the bounds given in the finitization E.g., all valid red-black trees within the bounds 12

Korat Search Systematically explores the bounded input space Orders values for each field to build its field domain Starts the search using candidate with all fields set to the first value in their domain Executes repok on the candidate Monitors repok s execution dynamically Records the field access order according to first access Generates the next candidate based on the execution Backtracks on the last field in field access order Prunes the search Avoids equivalent candidates Uses bytecode instrumentation to insert monitors 13

Korat Search in JPF Simple implementation of Korat using code instrumentation Use Verify.getInt, which returns a non-deterministic value, to index into a field domain Use shadow boolean fields to monitor field accesses Track assigned objects of a field domain to ensure exploration of non-isomorphic structures 14

Example: Code instrumentation in JPF public class RedBlackTree { // data for finitization and search static Node[] nodes; static int assigned_nodes; static int min_size; static int max_size; // instrumentation for "root" field Node root; boolean init_root = false; Node get_root() { if (!init_root) { init_root = true; int i = Verify.getInt(0, min(assigned_nodes + 1, nodes.length - 1)); if (i == assigned_nodes + 1) assigned_nodes++; root = nodes[i]; } return root; } // instrumentation for "size" field int size; boolean init_size = false; int get_size() { if (!init_size) { init_size = true; size = Verify.getInt(min_size, max_size); } return size; } static class Node {... // analogous instrumentation for each field } boolean repok() {... /* same as before*/} boolean istree() { if (get_root() == null) return get_size() == 0; if (get_root().get_parent()!= null) return false;... // replace read of each field "f" // with a call to "get_f" method } 15

Example: Finitization in JPF // "N" is the bound for finitization static void main(int N) { nodes = new Node[N + 1]; // nodes[0] = null; for (int i = 1; i < nodes.length; i++) nodes[i] = new Node(); min_size = max_size = N; RedBlackTree rbt = new RedBlackTree(); // this one call to "repok" will backtrack a number of times, // setting the fields of objects reachable from "rbt" if (rbt.repok()) print(rbt); }... // end of class RedBlackTree } A bound for the number of objects of each class 16

Optimizing Search in JPF Groups of changes made in JPF: Modifying interpreter Reducing state comparison costs Reducing backtracking costs for heap Reducing bytecode execution costs Reducing costs for stacks and threads Reducing other overhead costs These changes reduce the search time by over an order of magnitude 17

Modifying Interpreter Idea: instead of code instrumentation, change the interpreter itself Modified the class that implements the bytecode that reads a field from an object To check whether a field is initialized If not to create a non-deterministic choice point No need to instrument the code Makes it much easier to use Korat on JPF 18

Reducing State Comparison Costs JPF is a stateful model checker: Stores (hash value of) the states that it visits Compares (hash value of) newly encountered states with the visited states Idea: disable state comparison Korat search does not need any state comparison The search always produces different states 19

Reducing State Comparison Costs (2) Idea: reduce garbage collection (GC) GC helps the state comparison Unnecessary to perform GC that often Perform GC occasionally, only to reduce the amount of memory 20

Reducing Backtracking Costs for Heap State backtracking is expensive operation Storing and restoring the entire JVM states at the choice points Idea: undo backtracking Incrementally stores and restores states Only keeps track of the state changes that happen between choice points Later restores the state by undoing these state changes 21

Undo Backtracking An execution of a field assignment 1 2 3 root.right = null 1 2 execution: remember change n2.left n2.right n2.left n2.right n1 n3 n1 null 22

Undo Backtracking (2) Reduces the execution time as it does not require JPF to clone the integer array that encodes all fields of an object whose one field is being written to 1 2 3 root.right = null 1 2 execution: remember change n2.left n2.right n2.left n2.right n1 n3 n1 null backtracking: undo change 23

Reducing Backtracking Costs for Heap (2) Idea: special handling of singleton non-deterministic choice Verify.getInt(int lo, int hi) does not need to create a backtracking point if lo == hi Both Undo backtracking and Singleton non-deterministic choice changes have been added to JPF and are publicly available 24

Reducing Bytecode Execution Costs JPF is an interpreter for Java bytecodes For most bytecodes, JPF simply performs as a regular JVM Slow in executing even regular bytecodes Idea: use simple collections repok methods build fairly small collections A simple library of collections that execute faster on JPF, when collections are small Idea: execute on JVM Moving our library structures execution from the JPF level to the underlying JVM level 25

Reducing Costs for Stacks and Threads A major portion of JPF time goes on manipulation of stacks and threads Idea: optimize stack handling Simplify stack frames Shallow cloning rather than deep cloning of some stack frames Avoids copy on write when a stack frame is not shared Idea: optimize thread handling Korat operates on single-threaded code Unnecessary to pay the overhead for multi-threaded code Recall DynamicAreaIndex triples that Peter mentioned 26

Reducing Other Overhead Costs JPF is built as an extensible tool JPF uses: Listeners Logging Listeners and logging provide overhead in execution even when they are not needed Configuration flag to turn off listeners and logging 27

Evaluation: Time Speedup Experiment Subject BinaryTree BinHeap DisjSet DoublyLL FaultTree HeapArray RedBlackTree SearchTree SinglyLL SortedList N 11 8 5 11 6 8 9 8 11 9 Base 1,403.75 885.94 159.25 1,632.86 5,348.47 1,504.12 886.79 1,068.02 4,993.96 172.11 Mode 1 1,398.66 866.78 161.91 1,576.30 5,102.74 1,659.79 890.70 1,056.18 4,898.96 168.21 Mode 2 658.92 551.16 66.14 649.86 3,456.12 678.03 365.47 457.72 2,253.04 65.32 Time (sec) Mode 3 223.12 278.70 16.12 158.17 2,405.72 136.15 128.05 114.16 766.14 11.21 Mode 4 72.15 90.11 16.02 123.14 631.90 136.28 112.23 110.15 316.87 11.09 Mode 5 52.12 81.90 14.87 101.04 634.98 103.51 101.05 87.07 239.23 8.26 Exploration time for various modications to basic Mode 6 44.86 66.89 12.13 85.91 505.57 86.43 77.44 71.46 205.31 7.50 Time speedup 31.29x 13.25x 13.12x 19.01x 10.58x 17.40x 11.45x 14.95x 24.32x 22.96x Mode 1: Modifying interpreter Mode M: includes all of the optimizations used in Mode M-1 Mode 2: Reducing state comparison costs Mode 3: Reducing backtracking costs for heap Mode 4: Reducing bytecode execution costs Mode 5: Reducing costs for stacks and threads Mode 6: Reducing other overhead costs Modifications of JPF reduce the search time by over an order of magnitude 28

Evaluation: Memory Savings Experiment Peak Memory (MB) Memory Subject N Base Mode 2 Mode 6 savings BinaryTree 11 88.19 6.76 5.53 15.93x BinHeap 8 35.32 6.68 5.67 6.23x DisjSet 5 15.15 5.68 5.62 2.69x DoublyLL 11 83.70 6.53 5.78 14.47x FaultTree 6 258.91 7.07 6.20 41.75x HeapArray 8 21.17 5.68 5.58 3.79x RedBlackTree 9 63.52 7.00 5.95 10.66x SearchTree 8 84.85 6.76 5.79 14.64x SinglyLL 11 262.48 6.50 5.76 45.53x SortedList 9 14.82 6.08 5.21 2.84x Peak memory for selected modifications to basic Used Sun's jstat monitoring tool to measure the peak usage of garbage-collected heap 29

Summary Implemented the Korat search algorithm in JPF A basic implementation results in an slow search Modified several core operations of JPF to speed up the search Our modifications reduce the search time in JPF by over an order of magnitude Two modifications are already included in the publicly available JPF http://mir.cs.uiuc.edu/jpf Future work JPF as a solver for constraints in other languages Parallelize JPF constraint solver 30