diff --git a/.github/scripts/ci-test-weak-ref.sh b/.github/scripts/ci-test-weak-ref.sh new file mode 100755 index 00000000..376591e5 --- /dev/null +++ b/.github/scripts/ci-test-weak-ref.sh @@ -0,0 +1,174 @@ +set -xe + +. $(dirname "$0")/common.sh + +unset JAVA_TOOL_OPTIONS + +# To OpenJDK folder +cd $OPENJDK_PATH + +# Choose build: use slowdebug for shorter build time (32m user time for release vs. 20m user time for slowdebug) +export DEBUG_LEVEL=fastdebug + +# Build +sh configure --disable-warnings-as-errors --with-debug-level=$DEBUG_LEVEL +make CONF=linux-x86_64-normal-server-$DEBUG_LEVEL THIRD_PARTY_HEAP=$BINDING_PATH/openjdk + +export MMTK_NO_REFERENCE_TYPES=false + +# --- SemiSpace --- +export MMTK_PLAN=SemiSpace + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- Immix --- +export MMTK_PLAN=Immix + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- Immix --- +export MMTK_PLAN=GenImmix + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- GenCopy --- +export MMTK_PLAN=GenCopy + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# Fail non-deterministically +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb + +# Fail with OOM (code 137) +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd + +# This passes, but it takes horribly long time to run. We exclude it. +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- NoGC --- + +# Build +export MMTK_PLAN=NoGC + +# Test - the benchmarks that are commented out do not work yet +# Note: We could increase heap size when mmtk core can work for larger heap. We may get more benchmarks running. + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipes - OOM +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - OOM + +# --- MarkCompact --- +export MMTK_PLAN=MarkCompact +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -XX:TieredStopAtLevel=1 -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -XX:TieredStopAtLevel=1 -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- MarkSweep --- +export MMTK_PLAN=MarkSweep + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch +#- validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# Run benchmarks with the mark bit in the header now +unset MMTK_PLAN +MARK_IN_HEADER=1 make CONF=linux-x86_64-normal-server-$DEBUG_LEVEL THIRD_PARTY_HEAP=$BINDING_PATH/openjdk + +export MMTK_PLAN=MarkSweep + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch +#- validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- PageProtect --- +# Make sure this runs last in our tests unless we want to set it back to the default limit. +sudo sysctl -w vm.max_map_count=655300 + +export MMTK_PLAN=PageProtect + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd diff --git a/.github/scripts/ci-test.sh b/.github/scripts/ci-test.sh index f264b804..7f23c905 100755 --- a/.github/scripts/ci-test.sh +++ b/.github/scripts/ci-test.sh @@ -7,3 +7,5 @@ cd $cur ./ci-test-assertions.sh cd $cur ./ci-test-global-alloc-bit.sh +cd $cur +./ci-test-weak-ref.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f0a3443..cb2df40e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,19 @@ jobs: - name: Style checks run: ./.github/scripts/ci-style.sh + test-weak-ref: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: Setup environments + run: | + ./.github/scripts/ci-checkout.sh + ./.github/scripts/ci-setup.sh + + # Run the tests + - name: Dacapo Tests with Weak ref + run: ./.github/scripts/ci-test-weak-ref.sh + msrv: runs-on: ubuntu-18.04 steps: diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 7b4d5d09..01ba62f2 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -28,7 +28,7 @@ once_cell = "1.10.0" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "0babba20290d3c4e4cdb2a83284aa7204c9a23cc" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "21176127d1f0493444fd901ea7277099a24bcecc" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index ef5e5d51..5a2620cd 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -138,7 +138,7 @@ pub struct InstanceKlass { // #endif pub idnum_allocated_count: u16, pub init_state: u8, - pub reference_type: u8, + pub reference_type: ReferenceType, pub this_class_index: u16, // #if INCLUDE_JVMTI pub jvmti_cached_class_field_map: OpaquePointer, // JvmtiCachedClassFieldMap* @@ -154,6 +154,18 @@ pub struct InstanceKlass { pub fields: OpaquePointer, // Array* } +#[repr(u8)] +#[derive(Copy, Clone, Debug)] +#[allow(dead_code)] +pub enum ReferenceType { + None, // Regular class + Other, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below + Soft, // Subclass of java/lang/ref/SoftReference + Weak, // Subclass of java/lang/ref/WeakReference + Final, // Subclass of java/lang/ref/FinalReference + Phantom, // Subclass of java/lang/ref/PhantomReference +} + impl InstanceKlass { const HEADER_SIZE: usize = mem::size_of::() / BYTES_IN_WORD; const VTABLE_START_OFFSET: usize = Self::HEADER_SIZE * BYTES_IN_WORD; diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 96c40dc9..9e5e67c5 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -179,18 +179,18 @@ pub extern "C" fn modify_check(object: ObjectReference) { } #[no_mangle] -pub extern "C" fn add_weak_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_weak_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_weak_candidate(reff: ObjectReference) { + memory_manager::add_weak_candidate(&SINGLETON, reff) } #[no_mangle] -pub extern "C" fn add_soft_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_soft_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_soft_candidate(reff: ObjectReference) { + memory_manager::add_soft_candidate(&SINGLETON, reff) } #[no_mangle] -pub extern "C" fn add_phantom_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_phantom_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_phantom_candidate(reff: ObjectReference) { + memory_manager::add_phantom_candidate(&SINGLETON, reff) } // The harness_begin()/end() functions are different than other API functions in terms of the thread state. diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index c8d8c656..6cafd30a 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -77,6 +77,7 @@ pub struct OpenJDK_Upcalls { pub number_of_mutators: extern "C" fn() -> usize, pub schedule_finalizer: extern "C" fn(), pub prepare_for_roots_re_scanning: extern "C" fn(), + pub enqueue_references: extern "C" fn(objects: *const ObjectReference, len: usize), } pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut(); diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index 238b5951..ae9277dc 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -107,7 +107,39 @@ impl OopIterate for TypeArrayKlass { impl OopIterate for InstanceRefKlass { #[inline] fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + use crate::abi::*; + use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate}; self.instance_klass.oop_iterate(oop, closure); + + if Self::should_scan_weak_refs() { + let reference = ObjectReference::from(oop); + match self.instance_klass.reference_type { + ReferenceType::None => { + panic!("oop_iterate on InstanceRefKlass with reference_type as None") + } + ReferenceType::Weak => add_weak_candidate(reference), + ReferenceType::Soft => add_soft_candidate(reference), + ReferenceType::Phantom => add_phantom_candidate(reference), + // Process these two types normally (as if they are strong refs) + // We will handle final reference later + ReferenceType::Final | ReferenceType::Other => { + Self::process_ref_as_strong(oop, closure) + } + } + } else { + Self::process_ref_as_strong(oop, closure); + } + } +} + +impl InstanceRefKlass { + #[inline] + fn should_scan_weak_refs() -> bool { + use SINGLETON; + !*SINGLETON.get_options().no_reference_types + } + #[inline] + fn process_ref_as_strong(oop: Oop, closure: &mut impl EdgeVisitor) { let referent_addr = Self::referent_address(oop); closure.visit_edge(referent_addr); let discovered_addr = Self::discovered_address(oop); diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index 5950aa63..5e7c6309 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -1,23 +1,24 @@ +use crate::abi::{InstanceRefKlass, Oop}; use crate::OpenJDK; +use crate::UPCALLS; use mmtk::util::opaque_pointer::VMWorkerThread; use mmtk::util::ObjectReference; use mmtk::vm::ReferenceGlue; -use mmtk::TraceLocal; pub struct VMReferenceGlue {} impl ReferenceGlue for VMReferenceGlue { - fn set_referent(_reff: ObjectReference, _referent: ObjectReference) { - unimplemented!() + fn set_referent(reff: ObjectReference, referent: ObjectReference) { + let oop = Oop::from(reff); + unsafe { InstanceRefKlass::referent_address(oop).store(referent) }; } - fn get_referent(_object: ObjectReference) -> ObjectReference { - unimplemented!() + fn get_referent(object: ObjectReference) -> ObjectReference { + let oop = Oop::from(object); + unsafe { InstanceRefKlass::referent_address(oop).load::() } } - fn process_reference( - _trace: &mut T, - _reference: ObjectReference, - _tls: VMWorkerThread, - ) -> ObjectReference { - unimplemented!() + fn enqueue_references(references: &[ObjectReference], _tls: VMWorkerThread) { + unsafe { + ((*UPCALLS).enqueue_references)(references.as_ptr(), references.len()); + } } } diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index 7cb09dd6..0250386e 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -144,6 +144,7 @@ typedef struct { size_t (*number_of_mutators)(); void (*schedule_finalizer)(); void (*prepare_for_roots_re_scanning)(); + void (*enqueue_references)(void** objects, size_t len); } OpenJDK_Upcalls; extern void openjdk_gc_init(OpenJDK_Upcalls *calls, size_t heap_size); diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 760fa8e1..cff2b003 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -319,6 +319,27 @@ static void mmtk_prepare_for_roots_re_scanning() { #endif } +static void mmtk_enqueue_references(void** objects, size_t len) { + if (len == 0) { + return; + } + + MutexLocker x(Heap_lock); + + oop prev = NULL; + for (size_t i = 0; i < len; i++) { + oop reff = (oop) objects[i]; + if (prev != NULL) { + HeapAccess::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, reff); + } + prev = reff; + } + + oop old = Universe::swap_reference_pending_list(prev); + HeapAccess::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, old); + assert(Universe::has_reference_pending_list(), "Reference pending list is empty after swap"); +} + OpenJDK_Upcalls mmtk_upcalls = { mmtk_stop_all_mutators, mmtk_resume_mutators, @@ -360,4 +381,5 @@ OpenJDK_Upcalls mmtk_upcalls = { mmtk_number_of_mutators, mmtk_schedule_finalizer, mmtk_prepare_for_roots_re_scanning, + mmtk_enqueue_references }; diff --git a/openjdk/mmtkVMCompanionThread.cpp b/openjdk/mmtkVMCompanionThread.cpp index 4f99efba..17f2d2c1 100644 --- a/openjdk/mmtkVMCompanionThread.cpp +++ b/openjdk/mmtkVMCompanionThread.cpp @@ -76,6 +76,12 @@ void MMTkVMCompanionThread::run() { _reached_state = _threads_resumed; _lock->notify_all(); } + { + MutexLocker x(Heap_lock); + if (Universe::has_reference_pending_list()) { + Heap_lock->notify_all(); + } + } } }