JDK-6854812 : 6.0_14-b08 crashes with a SIGSEGV
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: hs16,6u14
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: generic,linux
  • CPU: x86
  • Submitted: 2009-06-25
  • Updated: 2012-10-01
  • Resolved: 2009-10-07
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6 JDK 7 Other
6u18Fixed 7Fixed hs16Fixed
Related Reports
Duplicate :  
Relates :  
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)


FULL OS VERSION :
SuSE Linux -10.3-x86_64

A DESCRIPTION OF THE PROBLEM :
I've had several programs crash the JVM. They all crashed at exactly the same spot at different times, so I believe this is JVM bug and not some OS issue. We just upgraded to 1.6.0u14 and started seeing this issue and haven't ever experienced the issue prior to this release.



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

THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The application randomly crashes the JVM at the same function when running our exremely large and proprietary application for a long period of time.


ERROR MESSAGES/STACK TRACES THAT OCCUR :

Attached seperatly

---------- BEGIN SOURCE ----------
Here is the code fragment of the function that causes the crash:

/** Periodically monitors java api client leases, closing sockets and killing active api requests belonging
   to clients having expired leases. */
  @SubL(source = "cycl/java-api-kernel.lisp", position = 4370)
  public static final SubLObject java_api_lease_monitor() {
    {
      final SubLThread thread = SubLProcess.currentSubLThread();
      {
        SubLObject current_utc_time_with_milliseconds = NIL;
        SubLObject uuid_strings_to_remove = NIL;
        while (true) {
          {
            SubLObject ignore_errors_tag = NIL;
            try {
              {
                SubLObject _prev_bind_0 = Errors.$error_handler$.currentBinding(thread);
                try {
                  Errors.$error_handler$.bind(Symbols.symbol_function($sym8$IGNORE_ERRORS_HANDLER), thread);
                  try {
                    if ((NIL != $java_api_leases$.getGlobalValue())) {
                      uuid_strings_to_remove = NIL;
                      current_utc_time_with_milliseconds = numeric_date_utilities.get_utc_time_with_milliseconds();
                      {
                        SubLObject lock = dictionary_utilities.synchronized_dictionary_lock($java_api_leases$.getGlobalValue());
                        SubLObject release = NIL;
                        try {
                          release = Locks.seize_lock(lock);
                          {
                            SubLObject iteration_state = dictionary_contents.do_dictionary_contents_state(dictionary.dictionary_contents(dictionary_utilities.synchronized_dictionary_dictionary($java_api_leases$.getGlobalValue())));
                            while ((NIL == dictionary_contents.do_dictionary_contents_doneP(iteration_state))) {
                              thread.resetMultipleValues();
                              {
                                SubLObject uuid_string = dictionary_contents.do_dictionary_contents_key_value(iteration_state);
                                SubLObject lease_expiration_time = thread.secondMultipleValue();
                                thread.resetMultipleValues();
                                {
                                  SubLObject error_message = NIL;
                                  SubLObject seconds_yet_to_wait = NIL;
                                  try {
                                    {
                                      SubLObject _prev_bind_0_1 = Errors.$error_handler$.currentBinding(thread);
                                      try {
                                        Errors.$error_handler$.bind($sym9$CATCH_ERROR_MESSAGE_HANDLER, thread);
                                        try {
                                          seconds_yet_to_wait = Numbers.divide(Numbers.subtract(lease_expiration_time, current_utc_time_with_milliseconds), $int10$1000);
                                          if (seconds_yet_to_wait.numL(ZERO_INTEGER)) {
                                            uuid_strings_to_remove = cons(uuid_string, uuid_strings_to_remove);
                                            release_resources_for_java_api_client(uuid_string, T);
                                          }
                                        } catch (Throwable catch_var) {
                                          Errors.handleThrowable(catch_var, NIL);
                                        }
                                      } finally {
                                        Errors.$error_handler$.rebind(_prev_bind_0_1, thread);
                                      }
                                    }
                                  } catch (Throwable ccatch_env_var) {
                                    error_message = Errors.handleThrowable(ccatch_env_var, subl_macro_promotions.$catch_error_message_target$.getGlobalValue());
                                  }
                                  if ((NIL != error_message)) {
                                    Errors.warn(error_message);
                                  }
                                }
                                iteration_state = dictionary_contents.do_dictionary_contents_next(iteration_state);
                              }
                            }
                            dictionary_contents.do_dictionary_contents_finalize(iteration_state);
                          }
                        } finally {
                          if ((NIL != release)) {
                            Locks.release_lock(lock);
                          }
                        }
                      }
                      {
                        SubLObject cdolist_list_var = uuid_strings_to_remove;
                        SubLObject uuid_string_to_remove = NIL;
                        for (uuid_string_to_remove = cdolist_list_var.first(); (NIL != cdolist_list_var); cdolist_list_var = cdolist_list_var.rest(), uuid_string_to_remove = cdolist_list_var.first()) {
                          {
                            SubLObject error_message = NIL;
                            try {
                              {
                                SubLObject _prev_bind_0_2 = Errors.$error_handler$.currentBinding(thread);
                                try {
                                  Errors.$error_handler$.bind($sym9$CATCH_ERROR_MESSAGE_HANDLER, thread);
                                  try {
                                    dictionary_utilities.synchronized_dictionary_remove($java_api_leases$.getGlobalValue(), uuid_string_to_remove);
                                  } catch (Throwable catch_var) {
                                    Errors.handleThrowable(catch_var, NIL);
                                  }
                                } finally {
                                  Errors.$error_handler$.rebind(_prev_bind_0_2, thread);
                                }
                              }
                            } catch (Throwable ccatch_env_var) {
                              error_message = Errors.handleThrowable(ccatch_env_var, subl_macro_promotions.$catch_error_message_target$.getGlobalValue());
                            }
                            if ((NIL != error_message)) {
                              Errors.warn(error_message);
                            }
                          }
                        }
                      }
                      Threads.sleep($java_api_lease_monitor_sleep_seconds$.getGlobalValue());
                    }
                  } catch (Throwable catch_var) {
                    Errors.handleThrowable(catch_var, NIL);
                  }
                } finally {
                  Errors.$error_handler$.rebind(_prev_bind_0, thread);
                }
              }
            } catch (Throwable ccatch_env_var) {
              ignore_errors_tag = Errors.handleThrowable(ccatch_env_var, $kw7$IGNORE_ERRORS_TARGET);
            }
          }
        }
      }
    }
  }
---------- END SOURCE ----------

Release Regression From : 6u13
The above release value was the last known release where this 
bug was not reproducible. Since then there has been a regression.

Release Regression From : 6u13
The above release value was the last known release where this 
bug was not reproducible. Since then there has been a regression.

Comments
EVALUATION http://hg.openjdk.java.net/hsx/hsx16/master/rev/b0d917e25d28
04-10-2009

EVALUATION http://hg.openjdk.java.net/hsx/hsx16/baseline/rev/b0d917e25d28
01-10-2009

EVALUATION http://hg.openjdk.java.net/jdk7/hotspot-comp/hotspot/rev/3a2aa26bdc58
16-09-2009

EVALUATION Because of the use of nested try/finally that merges back into the normal control flow, ciTypeFlow does a lot of cloning while trying to inline the jsr/ret patterns. This leads to very complex graphs which can sometimes break the check for irreducibility in ciTypeFlow::build_loop_tree since it assumes that the loops already have parents. A larger fix would be to reduce the amount of jsr/ret cloning since much of it is unnecessary but this is being handled under a different bug id, 6877170. A more limited fix is being pursued for hs16.
09-09-2009