diff --git a/CHANGES.txt b/CHANGES.txt
index a2bd3aa1a6..2b9e10cc95 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
2.1.2
+ * Fix Cassandra crash when running on JDK8 update 40 (CASSANDRA-8209)
* Optimize partitioner tokens (CASSANDRA-8230)
* Improve compaction of repaired/unrepaired sstables (CASSANDRA-8004)
* Make cache serializers pluggable (CASSANDRA-8096)
diff --git a/bin/cassandra.bat b/bin/cassandra.bat
index 31a0235139..5169c44951 100644
--- a/bin/cassandra.bat
+++ b/bin/cassandra.bat
@@ -54,7 +54,7 @@ if NOT DEFINED JAVA_HOME goto :err
REM -----------------------------------------------------------------------------
REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
- -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.2.6.jar"^
+ -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.2.8.jar"^
-Xms2G^
-Xmx2G^
-XX:+HeapDumpOnOutOfMemoryError^
diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh
index 50e6eafc0e..5b4ee0f06b 100644
--- a/bin/cassandra.in.sh
+++ b/bin/cassandra.in.sh
@@ -48,5 +48,5 @@ done
if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \
|| [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ]
then
- JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar"
+ JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar"
fi
diff --git a/build.xml b/build.xml
index e94ded8eba..e2785c1b26 100644
--- a/build.xml
+++ b/build.xml
@@ -369,7 +369,7 @@
-
+
@@ -688,7 +688,7 @@
-
+
@@ -1107,7 +1107,7 @@
-
+
@@ -1266,7 +1266,7 @@
-
+
@@ -1309,7 +1309,7 @@
-
+
diff --git a/conf/cassandra-env.ps1 b/conf/cassandra-env.ps1
index 906db7a62c..0595cf6f26 100644
--- a/conf/cassandra-env.ps1
+++ b/conf/cassandra-env.ps1
@@ -301,7 +301,7 @@ Function SetCassandraEnvironment
if (($env:JVM_VENDOR -ne "OpenJDK") -or ($env:JVM_VERSION.CompareTo("1.6.0") -eq 1) -or
(($env:JVM_VERSION -eq "1.6.0") -and ($env:JVM_PATCH_VERSION.CompareTo("22") -eq 1)))
{
- $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.2.6.jar"""
+ $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.2.8.jar"""
}
# enable assertions. disabling this in production will give a modest
diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh
index 875cbeb8e6..f5669bb8d1 100644
--- a/conf/cassandra-env.sh
+++ b/conf/cassandra-env.sh
@@ -173,7 +173,7 @@ JMX_PORT="7199"
JVM_OPTS="$JVM_OPTS -ea"
# add the jamm javaagent
-JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar"
+JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar"
# some JVMs will fill up their heap when accessed via JMX, see CASSANDRA-6541
JVM_OPTS="$JVM_OPTS -XX:+CMSClassUnloadingEnabled"
diff --git a/debian/cassandra.in.sh b/debian/cassandra.in.sh
index efb7abbcd8..bf76cf710a 100644
--- a/debian/cassandra.in.sh
+++ b/debian/cassandra.in.sh
@@ -26,5 +26,5 @@ CLASSPATH="$CLASSPATH:$EXTRA_CLASSPATH"
if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \
|| [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ]
then
- JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.6.jar"
+ JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar"
fi
diff --git a/lib/jamm-0.2.6.jar b/lib/jamm-0.2.6.jar
deleted file mode 100644
index 04e5c2ef3a..0000000000
Binary files a/lib/jamm-0.2.6.jar and /dev/null differ
diff --git a/lib/jamm-0.2.8.jar b/lib/jamm-0.2.8.jar
new file mode 100644
index 0000000000..e1cb6690ac
Binary files /dev/null and b/lib/jamm-0.2.8.jar differ
diff --git a/lib/licenses/jamm-0.2.6.txt b/lib/licenses/jamm-0.2.8.txt
similarity index 100%
rename from lib/licenses/jamm-0.2.6.txt
rename to lib/licenses/jamm-0.2.8.txt
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index f0116e51db..9f71d7186e 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -56,7 +56,7 @@ public class QueryProcessor implements QueryHandler
public static final QueryProcessor instance = new QueryProcessor();
private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class);
- private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_BEST);
+ private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_BEST).ignoreKnownSingletons();
private static final long MAX_CACHE_PREPARED_MEMORY = Runtime.getRuntime().maxMemory() / 256;
private static EntryWeigher cqlMemoryUsageWeigher = new EntryWeigher()
diff --git a/src/java/org/apache/cassandra/utils/ObjectSizes.java b/src/java/org/apache/cassandra/utils/ObjectSizes.java
index 3720385dbc..e05dcbaa70 100644
--- a/src/java/org/apache/cassandra/utils/ObjectSizes.java
+++ b/src/java/org/apache/cassandra/utils/ObjectSizes.java
@@ -33,7 +33,8 @@ public class ObjectSizes
{
private static final MemoryMeter meter = new MemoryMeter()
.omitSharedBufferOverhead()
- .withGuessing(MemoryMeter.Guess.FALLBACK_UNSAFE);
+ .withGuessing(MemoryMeter.Guess.FALLBACK_UNSAFE)
+ .ignoreKnownSingletons();
private static final long BUFFER_EMPTY_SIZE = measure(ByteBufferUtil.EMPTY_BYTE_BUFFER);
private static final long STRING_EMPTY_SIZE = measure("");