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

Different execution plan when using JIT vs interpreter

XMLWordPrintable

    • windows_7
    • Verified

        FULL PRODUCT VERSION :
        java version " 1.7.0_25 "
        Java(TM) SE Runtime Environment (build 1.7.0_25_b16)
        Java Hotspot(TM) 64-bit Server VM (build 23.25-b01, mixed mode)

        FULL OS VERSION :
        Windows 7 64-bit

        EXTRA RELEVANT SYSTEM CONFIGURATION :
        No additional configuration needed

        A DESCRIPTION OF THE PROBLEM :
        The attached sample program calls a method 10'000 times without changing any border conditions. As soon as the method gets compiled, the result of that method returns null instead of a instance.

        Please note that the attached sample was stripped down a lot and multiple coding standards were violated to make the sample code as small as possible.

        THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: No

        THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Did not try

        REGRESSION. Last worked in version 6u45

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        1) compile the sample java program
        2) run it with the java interpreter -> run through
        3) run it with the jit enabled -> returned method value is null and it throws an exception

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        I would expect that the program never throws an excpetion
        ERROR MESSAGES/STACK TRACES THAT OCCUR :
        no error messages

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        import java.util.ArrayList;
        import java.util.List;

        public class TestJITError {
        public static class NamedObject {
            public int id;
            public String name;
        public NamedObject(int id, String name) {
        this.id = id;
        this.name = name;
        }
        }

        public static class NamedObjectList {
        public List<NamedObject> namedObjectList = new ArrayList<NamedObject>();

            public NamedObject getBest(int id) {
                NamedObject bestObject = null;
                for (NamedObject o : namedObjectList) {
                    bestObject = id==o.id ? getBetter(bestObject, o) : bestObject;
                }
                return bestObject != null ? bestObject : null;
            }

            private static NamedObject getBetter(NamedObject p1, NamedObject p2) {
            return p1 == null ? p2 : (p2 == null) ? p1 : p2.name.compareTo(p1.name)>=0 ? p2 : p1;
            }
        }

        public static void main(String[] args) {
        // setup
        NamedObjectList b = new NamedObjectList();
        for (int i = 0; i < 10000; i++) {
        b.namedObjectList.add(new NamedObject(1, " 2012-12-31 " ));
        }
        b.namedObjectList.add(new NamedObject(2, " 2013-12-31 " ));

        // execution
        for (int i = 0; i < 100000; i++) {
        NamedObject x = b.getBest(2);
        // test
        if (x == null) {
        throw new RuntimeException( " x should never be null here!! (i= " + i + " ) " );
        }
        }
        System.out.println( " finished " );
        }
        }

        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        Refactoring of the java code will make it behave correctly.

              kvn Vladimir Kozlov
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: