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

C2 removes safepoint poll from loop

XMLWordPrintable

    • generic
    • generic

      FULL PRODUCT VERSION :
      java version "1.8.0_77"
      Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
      Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows [版本 10.0.10586]

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      notebook computer
      ASUS A550JK
      CPU:Intel(R) Core(TM) i7-4710HQ @2.50GHz

      A DESCRIPTION OF THE PROBLEM :
      If there are some threads(less than the number of computer's logic cpus) working with a endless loop(in that loop:increases an int variable(eg: ++i) and makes a comparison with '==',and has a volatile write), the function 'Thread.sleep' in other thread won't work correctly.

      REGRESSION. Last worked in version 8u77

      ADDITIONAL REGRESSION INFORMATION:
      java version "1.8.0_77"
      Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
      Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Just execute the test

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The console will print the sleep time per half-second:
      sleep time:0 vInt:0
      sleep time:501 vInt:20982098
      sleep time:500 vInt:41807469
      sleep time:500 vInt:65160899
      sleep time:501 vInt:90615990
      sleep time:500 vInt:115868104
      sleep time:501 vInt:134387463
      sleep time:500 vInt:157016031
      sleep time:500 vInt:177084187

      ACTUAL -
      It takes a long time(it's 96 seconds in this test) to print the third printout, means that it slept 96 seconds rather than 0.5 second
      sleep time:0 vInt:0
      sleep time:501 vInt:19474440
      sleep time:96389 vInt:103
      sleep time:500 vInt:23039342
      sleep time:500 vInt:43348896
      sleep time:501 vInt:64601276
      sleep time:500 vInt:90043833
      sleep time:500 vInt:108501281
      sleep time:501 vInt:131417790
      sleep time:500 vInt:153950317

      And the running jvisualvm.exe will frozen once this test start.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      public class SleepTest {
      private static volatile int vInt = 0;
      public static void main(String[] args){
      for(int n=0;n<2;n++){
      new Thread(){
      public void run() {
      int l=0,m=0;
      while(true){
      if(++l==0){
      if(++m == 0)
      //insure that it won't be optimized away
      System.out.println(l);
      }
      vInt=l;
      }
      }
      }.start();
      }
      long oldTime = System.currentTimeMillis();
      while(true){
      System.out.println("sleep time:"+(-oldTime+(oldTime = System.currentTimeMillis()))+"\t\tvInt:"+vInt);
      try {
      Thread.sleep(500);
      } catch (InterruptedException e) {}
      }
      }
      }
      ---------- END SOURCE ----------

            thartmann Tobias Hartmann
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: