Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6990442

(ref) Regression to clearing of a softly reachable object

    XMLWordPrintable

Details

    • gc
    • Cause Known
    • generic
    • generic

    Description

      Behavior change since 6u14. The GC decides not to clear the SoftReference but
      an object in the reference chain of that SoftReference is being cleared.

      Below is the test program showing the problem. Specifically,
      o2 is only reachable via s2 (SoftReference) and s2 is not cleared
      and thus w2.get() should return non-null.

      import java.lang.ref.*;
      import java.util.*;

      public class RefCompliance {
          
          RefCompliance () {
          }

          public static void test() {

              int[] o1 = new int[10];

              WeakReference w1 = new WeakReference(o1);
              SoftReference s1 = new SoftReference(w1);

              int[] o2 = new int[10];

              WeakReference w2 = new WeakReference(o2);
              SoftReference s2 = new SoftReference(w2);

              int[] o3 = new int[10];

              WeakReference w3 = new WeakReference(o3);

              o1 = null;
              o2 = null;
              o3 = null;
              w2 = null;

              // Scrub stack because of conservative collector
              int[] dummy1 = new int[10];
              int[] dummy2 = new int[10];

              System.gc();

              int res1;

              w2 = (WeakReference)s2.get();
              if (w1 == s1.get()) {
                  res1 = 0;
                  if (w1.get() == null) {
                      res1 += 100;
                  }
                  if (w2.get() == null) {
                      res1 += 10;
                  }
                  if (w3.get() == null) {
                      res1 += 1;
                  }
              } else {
                  res1 = -1;
              }

              if (res1 == 101) {
                  System.err.println("JDK1.2");
              } else if (res1 == 111) {
                  System.err.println("weakest link on strongest chain");
              } else if (res1 == 001) {
                  System.err.println("API spec");
              } else {
                  System.err.println("unknown: result " + res1);
              }
          }

          public static void main(String[] args) {
              test();
              test();
              test();
              test();
              test();
          }
      }

      $ /java/re/jdk/6u13/latest/binaries/solaris-i586/bin/java RefCompliance
      JDK1.2
      JDK1.2
      JDK1.2
      JDK1.2
      JDK1.2

      $ /java/re/jdk/6u14/latest/binaries/solaris-i586/bin/java RefCompliance
      weakest link on strongest chain
      weakest link on strongest chain
      weakest link on strongest chain
      weakest link on strongest chain
      weakest link on strongest chain

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              mchung Mandy Chung
              Votes:
              0 Vote for this issue
              Watchers:
              11 Start watching this issue

              Dates

                Created:
                Updated:
                Imported:
                Indexed: