Below is a list of scientific papers I've authored or co-authored. I try to keep it up to date but you may want to do a Google Scholar search to see an up-to-date list.

Computer Architecture and Networking

Jupiter rising: a decade of clos topologies and centralized control in Google's datacenter network (ACM SIGCOMM, 2015)

B4: Experience with a Globally-Deployed Software Defined WAN (ACM SIGCOMM, 2013)

The Datacenter as a Computer: An Introduction to the Design of Warehouse-Scale Machines, 2nd Edition (Morgan Claypool, 2013) (available for free on Google Play)

OpenFlow at Google (Open Networking Summit, 2012) (video)

Brawny cores still beat wimpy cores, most of the time (IEEE MICRO, 2010)

The Datacenter as a Computer: An Introduction to the Design of Warehouse-Scale Machines (Morgan Claypool, 2009; replaced by 2013 edition)

The case for energy-proportional computing (IEEE Computer, 2003)

Web search for a planet: The Google cluster architecture (IEEE Computer, 2003)

Multi-stage Cascaded Prediction (Europar '99)

The Cascaded Predictor: Economic and Adaptive Branch Target Prediction (MICRO-31)

Improving Indirect Branch Prediction With Source- and Arity-based Classification and Cascaded Prediction (Technical Report)

Accurate Indirect Branch Prediction (ISCA '98)

Limits of Indirect Branch Prediction (Technical Report)

Do object-oriented languages need special hardware support? (ECOOP '95)

Programming Language Implementation

Removing Unnecessary Synchronization in Java (OOPSLA '99)

Reducing Transfer Delay Using Java Class File Splitting and Prefetching (OOPSLA '99)

A Study of the Allocation Behavior of the SPECjvm98 Java Benchmarks (ECOOP '99)

The Space Overhead of Customization (Technical Report)

Java on Steroids: Sun's High-Performance Java Implementation (HotChips IX, August 1997)

Reconciling Responsiveness with Performance in Pure Object-Oriented Languages (TOPLAS 1996)

Dynamic vs. Static Optimization Techniques for Object-Oriented Languages (TAPOS 1996)

Eliminating Virtual Function Calls in C++ Programs (ECOOP '96)

The Direct Cost of Virtual Function Calls in C++ (OOPSLA '96)

Type Feedback vs. Concrete Type Analysis: A Comparison of Optimization Techniques for Object-Oriented Languages (OOPSLA '95)

Minimizing Row Displacement Dispatch Tables (OOPSLA '95)

Message Dispatch on Pipelined Processors (ECOOP '95)

Optimizing Dynamically-Dispatched Calls with Run-Time Type Feedback (PLDI '94)

Adaptive Optimization for Self: Reconciling High Performance with Exploratory Programming (Ph.D. thesis, Stanford University)

A Third-Generation Self Implementation (OOPSLA '94)

A Fast Write Barrier for Generational Garbage Collectors (OOPSLA '93 GC Workshop)

Debugging Optimized Code with Dynamic Deoptimization (PLDI '92)

Object, Message, and Performance: How They Coexist in Self (IEEE Computer 1992)

Optimizing Dynamically-Typed Object-Oriented Programming Languages with Polymorphic Inline Caches (ECOOP '91)

Software Engineering and Tools

Monkey see, monkey do: a tool for TCP tracing and replaying (USENIX '04)

Load-Time Adaptation: Efficient and Non-Intrusive Language Extension for Virtual Machines (Technical Report)

Dynamic Query-Based Debugging (ECOOP '99)

Adding Contracts To Java with Handshake (Technical Report)

jContractor: A Reflective Java Library to Support Design By Contract (Reflection '99)

Implementing Binary Component Adaptation for Java (Technical Report)

Binary Component Adaptation (ECOOP '98)

Query-Based Debugging of Object-Oriented Programs (OOPSLA '97)

Supporting the Integration and Evolution of Components Through Binary Component Adaptation (Technical Report)

Integrating Independently-Developed Components in Object-Oriented Languages (ECOOP '93)