--- old/test/java/lang/instrument/RedefineBigClass.sh 2013-07-03 20:38:10.783461468 +0400 +++ new/test/java/lang/instrument/RedefineBigClass.sh 2013-07-03 20:38:10.127469714 +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 # --- old/test/java/lang/instrument/RedefineBigClassApp.java 2013-07-03 20:38:12.255442961 +0400 +++ new/test/java/lang/instrument/RedefineBigClassApp.java 2013-07-03 20:38:11.615451008 +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,15 @@ * questions. */ +import java.io.*; + public class RedefineBigClassApp { 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 +40,36 @@ } 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; + final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb + if (vMemDelta > MEM_LEAK_THRESHOLD) { + System.err.println("FAIL: Virtual memory usage increased by " + + Long.valueOf(vMemDelta) + "Kb " + + "(greater than " + Long.valueOf(MEM_LEAK_THRESHOLD) + "Kb)"); + System.exit(1); + } else { + System.err.println("PASS: Virtual memory usage increased by " + + Long.valueOf(vMemDelta) + "Kb " + + "(not greater than " + Long.valueOf(MEM_LEAK_THRESHOLD) + "Kb)"); + } + } System.exit(0); } + + /** + * Return size of virtual memory allocated to the process. + * Linux specific. On other platforms and in case of any errors return 0. + */ + static private long getVMemSize() { + 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; + } }