8016838: improvement of RedefineBigClass and RetransformBigClass tests
authorigerasim
Tue, 23 Jul 2013 18:57:57 +0400
changeset 19039 accceacb7fa7
parent 19038 b232a1a962ba
child 19041 eaa98095d287
8016838: improvement of RedefineBigClass and RetransformBigClass tests Reviewed-by: dcubed
jdk/test/ProblemList.txt
jdk/test/java/lang/instrument/RedefineBigClass.sh
jdk/test/java/lang/instrument/RedefineBigClassApp.java
jdk/test/java/lang/instrument/RetransformBigClass.sh
jdk/test/java/lang/instrument/RetransformBigClassApp.java
--- 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;
+    }
 }