< prev index next >

test/hotspot/jtreg/vmTestbase/nsk/jdi/ReferenceType/instances/instances003/instances003.java

Print this page

        

*** 60,69 **** --- 60,70 ---- package nsk.jdi.ReferenceType.instances.instances003; import java.io.PrintStream; import java.util.*; + import com.sun.jdi.ObjectCollectedException; import com.sun.jdi.ObjectReference; import com.sun.jdi.ReferenceType; import nsk.share.Consts; import nsk.share.ObjectInstancesManager;
*** 120,150 **** // create 'createInstanceCount' instances of test class // create temporary strong references to prevent the weakly referred instances being GCed // during the time between creating them and disabling collection on them pipe.println(HeapwalkingDebuggee.COMMAND_CREATE_INSTANCES + ":" + className + ":" + createInstanceCount + ":" + referrerCount + ":" + referrerType + ! (referrerType.equals(ObjectInstancesManager.WEAK_REFERENCE) ? "|" + ObjectInstancesManager.STRONG_REFERENCE : "")); // Note! This test is broken, in the sense that it incorrectly assumes // that no GC can happen before it walks the heap. In practice, it seems // to only affect this test when using ZGC. However, this test will also // fail when using other GCs if an explicit GC is done here. // the instance counts should not be affected by creating multiple references checkDebugeeAnswer_instanceCounts(className, createInstanceCount, objectsToFilter); ReferenceType referenceType = debuggee.classByName(className); ! List<ObjectReference> instances = HeapwalkingDebugger.filterObjectReferrence(objectsToFilter, referenceType.instances(0)); ! for (ObjectReference or : instances) { ! or.disableCollection(); } // remove the temporary strong references so the weak references can be properly tested ! if (referrerType.equals(ObjectInstancesManager.WEAK_REFERENCE)) { pipe.println(HeapwalkingDebuggee.COMMAND_DELETE_REFERRERS + ":" + className + ":" + referrerCount + ":" + ObjectInstancesManager.STRONG_REFERENCE); if (!isDebuggeeReady()) { return; } } --- 121,162 ---- // create 'createInstanceCount' instances of test class // create temporary strong references to prevent the weakly referred instances being GCed // during the time between creating them and disabling collection on them + boolean useTempStrongReference = needTempStongReference(referrerType); pipe.println(HeapwalkingDebuggee.COMMAND_CREATE_INSTANCES + ":" + className + ":" + createInstanceCount + ":" + referrerCount + ":" + referrerType + ! (useTempStrongReference ? "|" + ObjectInstancesManager.STRONG_REFERENCE : "")); // Note! This test is broken, in the sense that it incorrectly assumes // that no GC can happen before it walks the heap. In practice, it seems // to only affect this test when using ZGC. However, this test will also // fail when using other GCs if an explicit GC is done here. // the instance counts should not be affected by creating multiple references checkDebugeeAnswer_instanceCounts(className, createInstanceCount, objectsToFilter); ReferenceType referenceType = debuggee.classByName(className); ! List<ObjectReference> allInstances = HeapwalkingDebugger.filterObjectReferrence(objectsToFilter, referenceType.instances(0)); ! // There are potentially other non-test Java threads allocating objects and triggering GC's. ! // We need to call disableCollection() on each object returned by referenceType.instances() ! // to deal with the case when GC was triggered. Otherwise, these objects can ! // be potentially collected. ! List<ObjectReference> instances = new LinkedList<>(); ! for (ObjectReference objRef : allInstances) { ! try { ! objRef.disableCollection(); ! instances.add(objRef); ! } catch (ObjectCollectedException ex) { ! // skip this references ! } } // remove the temporary strong references so the weak references can be properly tested ! if (useTempStrongReference) { pipe.println(HeapwalkingDebuggee.COMMAND_DELETE_REFERRERS + ":" + className + ":" + referrerCount + ":" + ObjectInstancesManager.STRONG_REFERENCE); if (!isDebuggeeReady()) { return; } }
*** 155,164 **** --- 167,177 ---- for (int i = 0; i < preventGCCount; i++) { instances.get(i).enableCollection(); } + pipe.println(HeapwalkingDebuggee.COMMAND_DELETE_INSTANCES + ":" + className + ":" + createInstanceCount); if (!isDebuggeeReady()) return;
*** 181,186 **** --- 194,208 ---- for (String referenceType : HeapwalkingDebuggee.includedIntoInstancesCountTypes) { for (String className : testClasses) testClass(className, referenceType); } } + + + private static boolean needTempStongReference(String referenceType) { + return ObjectInstancesManager.WEAK_REFERENCE.equals(referenceType) || + ObjectInstancesManager.JNI_WEAK_REFERENCE.equals(referenceType) || + ObjectInstancesManager.PHANTOM_REFERENCE.equals(referenceType) || + ObjectInstancesManager.SOFT_REFERENCE.equals(referenceType); + + } }
< prev index next >