Shadow VM is a deployment setting embedded in DiSL to isolate the execution of analysis code from application code, executing analysis code asynchronously with respect to the application code in a separate JVM process.
The goal of ShadowVM is to minimize perturbations of the observed program. When the ShadowVM is active, the observed application is instrumented using DiSL to emit the events of interests, which are then forwarded to the analysis executing in the separate Shadow VM via a native JVMTI agent attached to the observed JVM.
Using the ShadowVM avoids sharing states between the analysis and the observed application, which helps avoiding various known classes of bugs that may be introduced by less isolated approaches1. Moreover, Shadow VM eases proper handling of all thread lifecycle events, and guarantees that all thread termination events are received even during the shutdown phase of the JVM.
ShadowVM is part of DiSL, which is hosted as open-source project on GitHub.
You can find more information on DiSL and ShadowVM on the project website.
ShadowVM is also available for Android. You can find more information in the GitHub repository hosting its code. A demo is available here.
 Lukás Marek, Stephen Kell, Yudi Zheng, Lubomír Bulej, Walter Binder, Petr Tuma, Danilo Ansaloni, Aibek Sarimbekov, Andreas Sewe: ShadowVM: Robust and Comprehensive Dynamic Program Analysis for the Java Platform. GPCE 2013: 105-114 [pdf]
1 S. Kell, D. Ansaloni, W. Binder, and L. Marek. “The JVM is Not Observable Enough (and What to Do About It)”. VMIL 2012.