|
2 years ago | |
---|---|---|
agent/src/main/java | 9 years ago | |
dcevm/src | 5 years ago | |
gradle/wrapper | 8 years ago | |
hotspot/.hg/patches | 4 years ago | |
hotswap | 7 years ago | |
installer | 2 years ago | |
native | 9 years ago | |
.gitignore | 7 years ago | |
README.md | 4 years ago | |
build.cmd | 9 years ago | |
build.gradle | 8 years ago | |
gradle.properties | 4 years ago | |
gradlew | 9 years ago | |
gradlew.bat | 9 years ago | |
settings.gradle | 8 years ago |
There is a new distribution channel for DCEVM-11 binaries on - TravaOpenjdk!
This project is a fork of original DCEVM project.
The purpose of the project is to maintain enhanced class redefinition functionality for OpenJDK HotSpot 7/8.
You can download binaries here.
hotspot/.hg/patches/ contains patches for all supported versions. Each patch is named by concatenating prefix full
or light
with the OpenJDK HotSpot tag. full
patches support full redefenition capabilities (including removal of superclasses, for example). light
patches are easier to maintain, but they only support limited functionality (generally, additions to class hierarchies are fine, removals are not).
HotSpot tag is the name of the tag in the corresponding HotSpot Mercurial repository (Java 8/Java 7).
You need the following software to build DCEVM:
Currently the build is not compatible with Clang on Mac OS X, you need to install gcc 4.8 using the Homebrew:
brew tap homebrew/versions
brew install gcc48
Then set the following environmental properties:
export CC=/usr/local/bin/gcc-4.8
export CFLAGS=-fobjc-exceptions
export CXX=/usr/local/bin/g++-4.8
export SA_LDFLAGS=-fobjc-exceptions
export CFLAGS="${CFLAGS//-O2/-O3} ${CPPFLAGS} -Wno-error=deprecated-declarations -Wno-error=stringop-overflow= -Wno-error=return-type -Wno-error=cpp -fno-lifetime-dse -fno-delete-null-pointer-checks"
export CXXFLAGS="${CXXFLAGS} ${CPPFLAGS}"
./gradlew patch
to retrieve HotSpot sources and patch them../gradlew compileFastdebug
to build fastdebug
version or ./gradlew compileProduct
to build product
version.hotspot/build/fastdebug
or hotspot/build/product
.libjvm.so/jvm.dll/libjvm.dylib
in the target JRE.java -version
, it should include Dynamic Code Evolution
string.Or you can install DCEVM using the gradle script:
./gradlew installFastdebug -PtargetJre=$JAVA_HOME/jre
or ./gradlew installProduct -PtargetJre=$JAVA_HOME/jre
-XXaltjvm=dcevm
Alternatively, on Debian and Ubuntu systems DCEVM can be installed with the
openjdk-7-jre-dcevm
package and invoked by adding the -dcevm
command line parameter:
apt-get install openjdk-7-jre-dcevm
java -dcevm -version
, it should include Dynamic Code Evolution
string.JAVA_HOME
to point to JDK you want to test against (should be compatible with the version you set in gradle.properties)../gradlew patch
to retrieve HotSpot sources and patch them../gradlew test
to run tests.dcevm/build/reports/tests/index.html
To run tests from IDE, you need:
./gradlew agent:build
to build redefinition agent code.-javaagent:agent/build/libs/agent.jar
).-XXaltjvm=dcevm
).DCEVM executes deoptimization (purge of code cache) after any class redefinition. It leads to decrease JVM’s performance (after redefinition). This is especially problem on large scale projects with significant number of classes. Hotswap performance can be improved using an experimental option -XX:HotswapDeoptClassPath=
. One or more packages can be specified in comma separated list as parameters. Packages must contain all classes that will be potentially modified (redefined). Classes outside of this list won’t be included in the deoptimization. Usually it is sufficient to specify application main or root package. If com.sun.proxy.Proxy
is used in the application or by application’s framework, then this option should contain package com.sun.proxy
as well. If HotswapDeoptClassPath
option is not specified, then all classes will be deoptimized after redefinition. It is also recommended to clean all generated byte by reflection.
Example:
-XX:HotswapDeoptClassPath='com.myproject.,com.sun.proxy.$Proxy,sun.reflect.Generated'