Garbage collection race condition before final checks
Gary Adams
gary.adams at oracle.com
Wed Nov 9 19:26:05 UTC 2011
Here's an updated diff :
- added current CR# to the @bug tag
- made logger1 and logger2 instance variables
- renamed test instance variable lmxbeantest
- removed excessive diagnostic print outs
--- a/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
+++ b/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 7024172
+ * @bug 7024172 7067691
* @summary Test if proxy for PlatformLoggingMXBean is equivalent
* to proxy for LoggingMXBean
*
@@ -43,6 +43,13 @@
static String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2";
static String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown";
+ // These instance variables prevent premature logger garbage collection
+ // See getLogger() weak reference warnings.
+ Logger logger1;
+ Logger logger2;
+
+ static LoggingMXBeanTest lmxbeantest;
+
public static void main(String[] argv) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
LoggingMXBean proxy =
@@ -51,7 +58,7 @@
LoggingMXBean.class);
// test LoggingMXBean proxy
- LoggingMXBeanTest p = new LoggingMXBeanTest(proxy);
+ lmxbeantest = new LoggingMXBeanTest(proxy);
// check if the attributes implemented by PlatformLoggingMXBean
// and LoggingMXBean return the same value
@@ -59,14 +66,16 @@
ManagementFactory.getPlatformMXBean(mbs, PlatformLoggingMXBean.class);
checkAttributes(proxy, mxbean);
+
+ lmxbeantest = null;
}
// same verification as in java/util/logging/LoggingMXBeanTest2
public LoggingMXBeanTest(LoggingMXBean mbean) throws Exception {
- Logger logger1 = Logger.getLogger( LOGGER_NAME_1 );
+ logger1 = Logger.getLogger( LOGGER_NAME_1 );
logger1.setLevel(Level.FINE);
- Logger logger2 = Logger.getLogger( LOGGER_NAME_2 );
+ logger2 = Logger.getLogger( LOGGER_NAME_2 );
logger2.setLevel(null);
/*
@@ -207,6 +216,7 @@
// verify logger names
List<String> loggers1 = mxbean1.getLoggerNames();
List<String> loggers2 = mxbean2.getLoggerNames();
+
if (loggers1.size() != loggers2.size())
throw new RuntimeException("LoggerNames: unmatched number of
entries");
List<String> loggers3 = new ArrayList<>(loggers1);
@@ -219,7 +229,10 @@
if (!mxbean1.getLoggerLevel(logger)
.equals(mxbean2.getLoggerLevel(logger)))
throw new RuntimeException(
- "LoggerLevel: unmatched level for " + logger);
+ "LoggerLevel: unmatched level for (" + logger
+ + ", " + mxbean1.getLoggerLevel(logger)
+ + ", " + mxbean2.getLoggerLevel(logger) + ")");
+
if (!mxbean1.getParentLoggerName(logger)
.equals(mxbean2.getParentLoggerName(logger)))
throw new RuntimeException(
On 11/ 9/11 04:08 AM, Alan Bateman wrote:
> On 08/11/2011 15:35, Gary Adams wrote:
>> Here's another intermittent bug that is attributed
>> to the garbage collection of the loggers before the
>> final static check can be applied in the test.
>>
>> CR#7067691 :
>> java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java failing
>> intermittently
> I agree with Mandy that it would be great to do a quick audit of the other
> logging (and PlatformLoggingMXBean) tests to see if we have similar issues. I
> should explain that one reason why these test failures may not have been
> observed in the past is because most people ran jtreg in its default mode
> (called othervm mode, where each tests runs in its own VM). Nowadays we run
> the tests via the make file or use jtreg -agentvm so that tests are running
> sequentially in an agent VM. Not all areas can run in agent VM mode yet but
> for the areas that do then we get a good speed up as the startup cost is
> eliminated and also it's possible to have a pool of agent VMs to make use of
> all cores when doing test runs (-agentvm -concurrency:auto for example).
> However agent VM makes things less predictable and for these tests it means
> that the GC will be unpredictable which is why this test was failing only very
> intermittently.
>
> Anyway, the changes look fine to me. I agree with Mandy that many logger1 and
> logger2 could be instance variables. I would suggest "proxy" or something more
> readable rather than "testp" for the LoggingMXBean proxy. I also agree with
> Mandy's comment about adding the @bug.
>
> -Alan.
More information about the core-libs-dev
mailing list