changeset 9159:f2195a4340b8

6980984: java/lang/management/MemoryMXBean/MemoryManagement is not robust when getMax() returns -1 Reviewed-by: jbachorik, dfuchs
author sjiang
date Thu, 23 Jan 2014 15:17:36 +0100
parents 590f3b58e7e3
children b2741de0b485
files test/java/lang/management/MemoryMXBean/MemoryManagement.java
diffstat 1 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/test/java/lang/management/MemoryMXBean/MemoryManagement.java	Thu Jan 23 10:06:52 2014 +0100
+++ b/test/java/lang/management/MemoryMXBean/MemoryManagement.java	Thu Jan 23 15:17:36 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, 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
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug     4530538
+ * @bug     4530538 6980984
  * @summary Basic unit test of memory management testing:
- *          1) setUsatgeThreshold() and getUsageThreshold()
+ *          1) setUsageThreshold() and getUsageThreshold()
  *          2) test low memory detection on the old generation.
  *
  * @author  Mandy Chung
@@ -40,16 +40,18 @@
 import javax.management.openmbean.CompositeData;
 
 public class MemoryManagement {
-    private static MemoryMXBean mm = ManagementFactory.getMemoryMXBean();
-    private static List pools = ManagementFactory.getMemoryPoolMXBeans();
-    private static List managers = ManagementFactory.getMemoryManagerMXBeans();
-    private static MemoryPoolMXBean mpool = null;
-    private static boolean trace = false;
-    private static boolean testFailed = false;
+    private static final MemoryMXBean mm = ManagementFactory.getMemoryMXBean();
+    private static final List pools =
+            Collections.synchronizedList(ManagementFactory.getMemoryPoolMXBeans());
+    private static final List managers =
+            Collections.synchronizedList(ManagementFactory.getMemoryManagerMXBeans());
+    private static volatile MemoryPoolMXBean mpool = null;
+    private static volatile boolean trace = false;
+    private static volatile boolean testFailed = false;
     private static final int NUM_CHUNKS = 2;
-    private static long chunkSize;
+    private static volatile long chunkSize;
+    private static volatile int listenerInvoked = 0;
 
-    private static int listenerInvoked = 0;
     static class SensorListener implements NotificationListener {
         public void handleNotification(Notification notif, Object handback) {
             String type = notif.getType();
@@ -101,7 +103,13 @@
 
         // Now set threshold
         MemoryUsage mu = mpool.getUsage();
-        chunkSize = (mu.getMax() - mu.getUsed()) / 20;
+        long max = mu.getMax();
+        if (max != -1) {
+            chunkSize = (max - mu.getUsed()) / 20;
+        } else { // 6980984
+            System.gc();
+            chunkSize = Runtime.getRuntime().freeMemory()/20;
+        }
         newThreshold = mu.getUsed() + (chunkSize * NUM_CHUNKS);
 
         System.out.println("Setting threshold for " + mpool.getName() +