United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-6854812 6.0_14-b08 crashes with a SIGSEGV
JDK-6854812 : 6.0_14-b08 crashes with a SIGSEGV

Details
Type:
Bug
Submit Date:
2009-06-25
Status:
Resolved
Updated Date:
2012-10-01
Project Name:
JDK
Resolved Date:
2009-10-07
Component:
hotspot
OS:
linux,generic
Sub-Component:
compiler
CPU:
x86
Priority:
P3
Resolution:
Fixed
Affected Versions:
hs16,6u14
Fixed Versions:
hs16 (b10)

Related Reports
Backport:
Backport:
Backport:
Backport:
Duplicate:
Relates:
Relates:

Sub Tasks

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

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.
                                     
2009-09-09
EVALUATION

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

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

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



Hardware and Software, Engineered to Work Together