8016838: improvement of RedefineBigClass and RetransformBigClass tests
Reviewed-by: dcubed
--- a/jdk/test/ProblemList.txt Mon Jul 22 22:11:44 2013 -0700
+++ b/jdk/test/ProblemList.txt Tue Jul 23 18:57:57 2013 +0400
@@ -137,6 +137,11 @@
# 8015780
java/lang/reflect/Method/GenericStringTest.java generic-all
+# 8019845 due to memleak not related to the tested fix
+java/lang/instrument/RedefineBigClass.sh linux-x64
+java/lang/instrument/RetransformBigClass.sh linux-x64
+
+
############################################################################
# jdk_management
--- a/jdk/test/java/lang/instrument/RedefineBigClass.sh Mon Jul 22 22:11:44 2013 -0700
+++ b/jdk/test/java/lang/instrument/RedefineBigClass.sh Tue Jul 23 18:57:57 2013 +0400
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
#
# @test
-# @bug 7121600
+# @bug 7121600 8016838
# @summary Redefine a big class.
# @author Daniel D. Daugherty
#
--- a/jdk/test/java/lang/instrument/RedefineBigClassApp.java Mon Jul 22 22:11:44 2013 -0700
+++ b/jdk/test/java/lang/instrument/RedefineBigClassApp.java Tue Jul 23 18:57:57 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -21,12 +21,21 @@
* questions.
*/
+import java.io.*;
+
public class RedefineBigClassApp {
+ /**
+ * Memory leak is assumed, if application consumes more than specified amount of memory during its execution.
+ * The number is given in Kb.
+ */
+ private static final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb
+
public static void main(String[] args) throws Exception {
System.out.println("Creating instance of " +
RedefineBigClassAgent.clz);
RedefineBigClassAgent.clz.newInstance();
+ long vMemBefore = getVMemSize();
int count = 0;
while (!RedefineBigClassAgent.doneRedefining) {
System.out.println("App loop count: " + ++count);
@@ -37,6 +46,39 @@
}
System.out.println("App looped " + count + " times.");
+ long vMemAfter = getVMemSize();
+ if (vMemBefore == 0 || vMemAfter == 0) {
+ System.err.println("WARNING: Cannot perform memory leak detection on this OS");
+ } else {
+ long vMemDelta = vMemAfter - vMemBefore;
+ if (vMemDelta > MEM_LEAK_THRESHOLD) {
+ System.err.println("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ System.exit(1);
+ }
+ System.err.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ }
System.exit(0);
}
+
+ /**
+ * Return size of virtual memory allocated to the process in Kb.
+ * Linux specific. On other platforms and in case of any errors return 0.
+ */
+ private static long getVMemSize() {
+
+ // Refer to the Linux proc(5) man page for details about /proc/self/stat file
+ //
+ // In short, this file contains status information about the current process
+ // written in one line. The fields are separated with spaces.
+ // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes'
+
+ try (FileReader fileReader = new FileReader("/proc/self/stat");
+ BufferedReader bufferedReader = new BufferedReader(fileReader)) {
+ String line = bufferedReader.readLine();
+ return Long.parseLong(line.split(" ")[22]) / 1024;
+ } catch (Exception ex) {}
+ return 0;
+ }
}
--- a/jdk/test/java/lang/instrument/RetransformBigClass.sh Mon Jul 22 22:11:44 2013 -0700
+++ b/jdk/test/java/lang/instrument/RetransformBigClass.sh Tue Jul 23 18:57:57 2013 +0400
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
#
# @test
-# @bug 7122253
+# @bug 7122253 8016838
# @summary Retransform a big class.
# @author Daniel D. Daugherty
#
--- a/jdk/test/java/lang/instrument/RetransformBigClassApp.java Mon Jul 22 22:11:44 2013 -0700
+++ b/jdk/test/java/lang/instrument/RetransformBigClassApp.java Tue Jul 23 18:57:57 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -21,12 +21,21 @@
* questions.
*/
+import java.io.*;
+
public class RetransformBigClassApp {
+ /**
+ * Memory leak is assumed, if application consumes more than specified amount of memory during its execution.
+ * The number is given in Kb.
+ */
+ private static final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb
+
public static void main(String[] args) throws Exception {
System.out.println("Creating instance of " +
RetransformBigClassAgent.clz);
RetransformBigClassAgent.clz.newInstance();
+ long vMemBefore = getVMemSize();
int count = 0;
while (!RetransformBigClassAgent.doneRetransforming) {
System.out.println("App loop count: " + ++count);
@@ -37,6 +46,39 @@
}
System.out.println("App looped " + count + " times.");
+ long vMemAfter = getVMemSize();
+ if (vMemBefore == 0 || vMemAfter == 0) {
+ System.err.println("WARNING: Cannot perform memory leak detection on this OS");
+ } else {
+ long vMemDelta = vMemAfter - vMemBefore;
+ if (vMemDelta > MEM_LEAK_THRESHOLD) {
+ System.err.println("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ System.exit(1);
+ }
+ System.err.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " +
+ "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)");
+ }
System.exit(0);
}
+
+ /**
+ * Return size of virtual memory allocated to the process in Kb.
+ * Linux specific. On other platforms and in case of any errors return 0.
+ */
+ private static long getVMemSize() {
+
+ // Refer to the Linux proc(5) man page for details about /proc/self/stat file
+ //
+ // In short, this file contains status information about the current process
+ // written in one line. The fields are separated with spaces.
+ // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes'
+
+ try (FileReader fileReader = new FileReader("/proc/self/stat");
+ BufferedReader bufferedReader = new BufferedReader(fileReader)) {
+ String line = bufferedReader.readLine();
+ return Long.parseLong(line.split(" ")[22]) / 1024;
+ } catch (Exception ex) {}
+ return 0;
+ }
}