This paper describes a run-time specialization system for the Java language. One of the main difficulties of supporting the full Java language resides in a sound yet effective management of references to objects. This is because the specialization process may share references with the running application that executes the residual code, and because side-effects through those references by the specialization process could easily break the semantics of the running application. To cope with these difficulties, we elaborate requirements that ensure sound run-time specialization. Based on them, we design and implement a run-time specialization system for the Java language, which exhibits, for instance, approximately 20-25% speed-up factor for a ray-tracing application. Categories and Subject Descriptors D.3.4 [Programming Languages]: Processors—Code generation, Optimization, Run-time environments; F.3.2 [Logics and Meanings of Programs]: Semantics of Programming Languages—Partial eva...