United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-6912018 CMS: guarantee(head() != 0,"The head of the list cannot be NULL")
JDK-6912018 : CMS: guarantee(head() != 0,"The head of the list cannot be NULL")

Details
Type:
Bug
Submit Date:
2009-12-19
Status:
Closed
Updated Date:
2011-03-08
Project Name:
JDK
Resolved Date:
2011-03-08
Component:
hotspot
OS:
solaris,generic,linux_redhat_5.2,solaris_10
Sub-Component:
gc
CPU:
x86,sparc,generic
Priority:
P3
Resolution:
Fixed
Affected Versions:
6u1,6u5-rev,6u16,6u18,7
Fixed Versions:
hs17 (b07)

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

Sub Tasks

Description
Unexpected Error
------------------------------------------------------------------------------
Internal Error at binaryTreeDictionary.cpp:258, pid=2490, tid=8
Error: guarantee(head() != 0,"The head of the list cannot be NULL")

                                    

Comments
EVALUATION

The assertion failure exposed in additional testing indicated that 
the number of blocks being taken in  par_get_chunk_of_blocks() was 
incorrectly reduced to 0.  A fix for that case was made and testing
of that fix for the failed guarantee reported here is in progress.
                                     
2009-12-22
SUGGESTED FIX

diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp--- a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
+++ b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
@@ -2731,6 +2731,14 @@ par_get_chunk_of_blocks(size_t word_sz,
     if (rem > 0 && rem < MinChunkSize) {
       n--; rem += word_sz;
     }
+    // If n is 0, there chunk fc that was found is not large
+    // enough to leave a viable remainder.  Return fc to the
+    // dictionary and return.
+    if (n == 0) {
+      returnChunkToDictionary(fc);
+      return;
+    }
+
     // First return the remainder, if any.
     // Note that we hold the lock until we decide if we're going to give
     // back the remainder to the dictionary, since a contending allocator
                                     
2009-12-22
SUGGESTED FIX

The updated fix (assertion check added).

arches% hg diff src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
diff --git a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
--- a/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
+++ b/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
@@ -3075,7 +3075,18 @@ void CompactibleFreeListSpace:: par_get_
     if (rem > 0 && rem < MinChunkSize) {
       n--; rem += word_sz;
     }
-    assert((ssize_t)n >= 1, "Control point invariant");
+    // Note that at this point we may have n == 0.
+    assert((ssize_t)n >= 0, "Control point invariant");
+
+    // If n is 0, the chunk fc that was found is not large
+    // enough to leave a viable remainder.  We are unable to
+    // allocate even one block.  Return fc to the
+    // dictionary and return, leaving "fl" empty.
+    if (n == 0) {
+      returnChunkToDictionary(fc);
+      return;
+    }
+
     // First return the remainder, if any.
     // Note that we hold the lock until we decide if we're going to give
     // back the remainder to the dictionary, since a concurrent allocation
                                     
2009-12-29
EVALUATION

http://hg.openjdk.java.net/jdk7/hotspot-gc/hotspot/rev/05b775309e59
                                     
2010-01-07
EVALUATION

http://hg.openjdk.java.net/jdk7/hotspot/hotspot/rev/05b775309e59
                                     
2010-01-09



Hardware and Software, Engineered to Work Together