You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by xl...@apache.org on 2007/05/11 10:14:52 UTC

svn commit: r537127 - in /harmony/enhanced/drlvm/trunk/vm/gc_gen/src: common/gc_common.cpp common/gc_space.h common/space_tuner.cpp gen/gen.cpp gen/gen.h gen/gen_adapt.cpp mark_compact/mspace_slide_compact.cpp mark_sweep/lspace.h

Author: xli
Date: Fri May 11 01:14:50 2007
New Revision: 537127

URL: http://svn.apache.org/viewvc?view=rev&rev=537127
Log:
HARMONY-3825 : Patch for adapative heap size extension

Modified:
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.h

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp Fri May 11 01:14:50 2007
@@ -251,6 +251,11 @@
   gc_gen_assign_free_area_to_mutators((GC_Gen*)gc);
 }
 
+void gc_adjust_heap_size(GC* gc)
+{
+  gc_gen_adjust_heap_size((GC_Gen*)gc);
+}
+
 void gc_copy_interior_pointer_table_to_rootset();
 
 void gc_reclaim_heap(GC* gc, unsigned int gc_cause)
@@ -263,8 +268,6 @@
   gc->cause = gc_cause;
   gc_decide_collection_kind((GC_Gen*)gc, gc_cause);
 
-
-  //For_LOS_extend!
 #ifdef GC_FIXED_SIZE_TUNER
   gc_space_tune_before_gc_fixed_size(gc, gc_cause);
 #else
@@ -273,8 +276,7 @@
 #endif
 
 #ifdef MARK_BIT_FLIPPING
-  if(gc_match_kind(gc, MINOR_COLLECTION))
-    mark_bit_flip();
+  if(gc_match_kind(gc, MINOR_COLLECTION)) mark_bit_flip();
 #endif
   
   gc_metadata_verify(gc, TRUE);
@@ -291,21 +293,21 @@
   /* this has to be done after all mutators are suspended */
   gc_reset_mutator_context(gc);
 
-  if(!IGNORE_FINREF )
-    gc_set_obj_with_fin(gc);
+  if(!IGNORE_FINREF ) gc_set_obj_with_fin(gc);
 
   gc_gen_reclaim_heap((GC_Gen*)gc);
   
   gc_reset_interior_pointer_table();
-    
+
   gc_metadata_verify(gc, FALSE);
 
+  gc_adjust_heap_size(gc);
+
   int64 pause_time = time_now() - start_time;  
   gc->time_collections += pause_time;
   gc_gen_adapt((GC_Gen*)gc, pause_time);
 
-  if(gc_is_gen_mode())
-    gc_prepare_mutator_remset(gc);
+  if(gc_is_gen_mode()) gc_prepare_mutator_remset(gc);
   
   if(!IGNORE_FINREF ){
     gc_put_finref_to_vm(gc);
@@ -317,16 +319,12 @@
 #endif
   }
 
-  //For_LOS_extend!
   gc_space_tuner_reset(gc);
-  
+
   gc_assign_free_area_to_mutators(gc);
-  
+
   vm_resume_threads_after();
   return;
 }
-
-
-
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h Fri May 11 01:14:50 2007
@@ -137,9 +137,9 @@
   new_last_block->next = NULL;
 }
 
-inline void blocked_space_extend(Blocked_Space* space, unsigned int changed_size)
+inline void blocked_space_extend(Blocked_Space* space, POINTER_SIZE_INT changed_size)
 {
-  unsigned int block_inc_count = changed_size >> GC_BLOCK_SHIFT_COUNT;
+  POINTER_SIZE_INT block_inc_count = changed_size >> GC_BLOCK_SHIFT_COUNT;
   
   void* old_base = (void*)&space->blocks[space->num_managed_blocks];
   void* commit_base = (void*)round_down_to_size((POINTER_SIZE_INT)old_base, SPACE_ALLOC_UNIT);
@@ -152,7 +152,8 @@
 
   void* new_end = (void*)((POINTER_SIZE_INT)commit_base + commit_size);
   space->committed_heap_size = (POINTER_SIZE_INT)new_end - (POINTER_SIZE_INT)space->heap_start;
-  
+  /*Fixme: For_Heap_Adjust, but need fix if static mapping.*/
+  space->heap_end = new_end;
   /* init the grown blocks */
   Block_Header* block = (Block_Header*)commit_base;
   Block_Header* last_block = (Block_Header*)((Block*)block -1);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp Fri May 11 01:14:50 2007
@@ -106,7 +106,7 @@
   }
   
 check_size:
-  tuner->tuning_size = round_down_to_size(tuner->tuning_size, GC_BLOCK_SIZE_BYTES);
+  tuner->tuning_size = round_up_to_size(tuner->tuning_size, GC_BLOCK_SIZE_BYTES);
   if(tuner->tuning_size == 0){
     tuner->kind = TRANS_NOTHING;
     lspace->move_object = 0;
@@ -137,9 +137,9 @@
   Blocked_Space* fspace = (Blocked_Space*)gc_get_nos((GC_Gen*)gc);
   Space* lspace = (Space*)gc_get_los((GC_Gen*)gc);
 
-  POINTER_SIZE_INT los_expect_survive_sz = (POINTER_SIZE_INT)((float)(lspace->surviving_size + lspace->alloced_size) * lspace->survive_ratio);
-  POINTER_SIZE_INT los_expect_free_sz = ((lspace->committed_heap_size > los_expect_survive_sz) ? 
-                                                            (lspace->committed_heap_size - los_expect_survive_sz) : 0);
+  POINTER_SIZE_INT los_expect_surviving_sz = (POINTER_SIZE_INT)((float)(lspace->surviving_size + lspace->alloced_size) * lspace->survive_ratio);
+  POINTER_SIZE_INT los_expect_free_sz = ((lspace->committed_heap_size > los_expect_surviving_sz) ? 
+                                                            (lspace->committed_heap_size - los_expect_surviving_sz) : 0);
   POINTER_SIZE_INT mos_expect_survive_sz = (POINTER_SIZE_INT)((float)(mspace->surviving_size + mspace->alloced_size) * mspace->survive_ratio);
   POINTER_SIZE_INT mos_expect_threshold = mspace_get_expected_threshold((Mspace*)mspace);
   POINTER_SIZE_INT mos_expect_free_sz = ((mos_expect_threshold > mos_expect_survive_sz)?
@@ -304,7 +304,7 @@
     }
     los_live_obj_size = round_up_to_size(los_live_obj_size, GC_BLOCK_SIZE_BYTES);
     los_live_obj_size += (collector_num << 2 << GC_BLOCK_SHIFT_COUNT);
-    
+
     Lspace *los = (Lspace*)gc_get_los((GC_Gen*)gc);
     Space_Tuner *tuner = gc->tuner;
     POINTER_SIZE_INT los_max_shrink_size = 0;

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp Fri May 11 01:14:50 2007
@@ -71,14 +71,14 @@
 
   min_nos_size_bytes *=  gc_gen->_num_processors;
 
-  POINTER_SIZE_INT min_nos_size_threshold = max_heap_size>>5;
+  POINTER_SIZE_INT min_nos_size_threshold = min_heap_size>>5;
   if(min_nos_size_bytes  > min_nos_size_threshold){
     min_nos_size_bytes = round_down_to_size(min_nos_size_threshold,SPACE_ALLOC_UNIT);
   }
   
   if( MIN_NOS_SIZE )  min_nos_size_bytes = MIN_NOS_SIZE;
 
-  POINTER_SIZE_INT los_size = max_heap_size >> 7;
+  POINTER_SIZE_INT los_size = min_heap_size >> 7;
   if(INIT_LOS_SIZE) los_size = INIT_LOS_SIZE;
   if(los_size < min_los_size_bytes ) 
     los_size = min_los_size_bytes ;
@@ -96,21 +96,21 @@
   gc_gen->survive_ratio = 0.2f;
 
   if(NOS_SIZE){
-    los_mos_size = max_heap_size - NOS_SIZE;
+    los_mos_size = min_heap_size - NOS_SIZE;
     mos_reserve_size = los_mos_size - los_size;  
 
     nos_commit_size = NOS_SIZE;
     nos_reserve_size = NOS_SIZE;
   
   }else{  
-    los_mos_size = max_heap_size;
+    los_mos_size = min_heap_size;
     mos_reserve_size = los_mos_size - los_size;
-    nos_commit_size = (POINTER_SIZE_INT)(((float)(max_heap_size - los_size))/(1.0f + gc_gen->survive_ratio));
+    nos_commit_size = (POINTER_SIZE_INT)(((float)(min_heap_size - los_size))/(1.0f + gc_gen->survive_ratio));
     nos_reserve_size = mos_reserve_size;
   }
     
   nos_commit_size = round_down_to_size(nos_commit_size, SPACE_ALLOC_UNIT);  
-  mos_commit_size = max_heap_size - los_size - nos_commit_size;
+  mos_commit_size = min_heap_size - los_size - nos_commit_size;
 
   /* allocate memory for gc_gen */
   void* reserved_base;
@@ -142,8 +142,8 @@
     }
     reserved_base = vm_reserve_mem(los_mos_base, los_mos_size);
   }
-  
-#else /* STATIC_NOS_MAPPING */
+/* NON_STATIC_NOS_MAPPING */  
+#else 
 
   reserved_base = NULL;
   if(large_page_hint){
@@ -157,15 +157,24 @@
     }
   }
   
-  if(reserved_base==NULL){
+  if(reserved_base == NULL){
+    Boolean max_size_reduced = 0;
     reserved_base = vm_reserve_mem((void*)0, max_heap_size + SPACE_ALLOC_UNIT);
-    reserved_base = (void*)round_up_to_size((POINTER_SIZE_INT)reserved_base, SPACE_ALLOC_UNIT);
-    assert((POINTER_SIZE_INT)reserved_base%SPACE_ALLOC_UNIT == 0);
-
+    
     while( !reserved_base ){
-      printf("Non-static NOS mapping: Can't allocate memory at address %x for specified size %x", reserved_base, max_heap_size);  
-      exit(0);      
+      max_size_reduced = 1;
+      max_heap_size -= SPACE_ALLOC_UNIT;
+      reserved_base = vm_reserve_mem((void*)0, max_heap_size + SPACE_ALLOC_UNIT);
     }
+    if(max_heap_size < min_heap_size){
+      printf("Non-static NOS mapping: Max heap size could not be gauranteed greater than min heap size according to memory limitation.\n");  
+      exit(0);
+    }else if(max_size_reduced){
+      printf("Non-static NOS mapping: Max heap size is reduced to %x according to memory limitation.\n", max_heap_size);
+    }//else printf("Max size: %x, heap_start: %lx\n", max_heap_size, reserved_base);
+
+    reserved_base = (void*)round_up_to_size((POINTER_SIZE_INT)reserved_base, SPACE_ALLOC_UNIT);
+    assert((POINTER_SIZE_INT)reserved_base%SPACE_ALLOC_UNIT == 0);
   }
 
   reserved_end = (void*)((POINTER_SIZE_INT)reserved_base + max_heap_size);
@@ -205,9 +214,6 @@
   nos->collect_algorithm = MINOR_ALGO;
   mos->collect_algorithm = MAJOR_ALGO;
 
-  /*Give GC a hint of space survive ratio.*/
-//  nos->survive_ratio = gc_gen->survive_ratio;
-//  mos->survive_ratio = gc_gen->survive_ratio;
   gc_space_tuner_initialize((GC*)gc_gen);
 
   gc_gen_mode_adapt_init(gc_gen);
@@ -216,7 +222,6 @@
                                 space_committed_size((Space*)gc_gen->mos) +
                                 space_committed_size((Space*)gc_gen->los);
   
-
   set_native_finalizer_thread_flag(!IGNORE_FINREF);
   set_native_ref_enqueue_thread_flag(!IGNORE_FINREF);
   
@@ -260,12 +265,6 @@
 
 unsigned int gc_get_processor_num(GC_Gen* gc){ return gc->_num_processors;}
 
-
-static Boolean major_collection_needed(GC_Gen* gc)
-{
-  return space_used_memory_size((Blocked_Space*)gc->nos)*gc->survive_ratio > (space_free_memory_size((Blocked_Space*)gc->mos));
-}
-
 Boolean FORCE_FULL_COMPACT = FALSE;
 
 void gc_decide_collection_kind(GC_Gen* gc, unsigned int cause)
@@ -345,6 +344,64 @@
   return;     
 }
 
+void gc_gen_adjust_heap_size(GC_Gen* gc)
+{
+  if(gc_match_kind((GC*)gc, MINOR_COLLECTION)) return;
+  if(gc->committed_heap_size == max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL) return;
+  
+  Mspace* mos = gc->mos;
+  Fspace* nos = gc->nos;
+  Lspace* los = gc->los;
+  /*We can not tolerate gc->survive_ratio be greater than threshold twice continuously.
+   *Or, we must adjust heap size
+   */
+  static unsigned int tolerate = 0;
+
+  POINTER_SIZE_INT heap_total_size = los->committed_heap_size + mos->committed_heap_size + nos->committed_heap_size;
+  assert(heap_total_size == gc->committed_heap_size);
+
+  assert(nos->surviving_size == 0);  
+  POINTER_SIZE_INT heap_surviving_size = mos->surviving_size + los->surviving_size; 
+  assert(heap_total_size > heap_surviving_size);
+
+  float heap_survive_ratio = (float)heap_surviving_size / (float)heap_total_size;
+  float threshold_survive_ratio = 0.3f;
+  float regular_survive_ratio = 0.125f;
+
+  POINTER_SIZE_INT new_heap_total_size = 0;
+  POINTER_SIZE_INT adjust_size = 0;
+
+  if(heap_survive_ratio < threshold_survive_ratio) return;
+
+  if(++tolerate < 2) return;
+  tolerate = 0;
+  
+  new_heap_total_size = (POINTER_SIZE_INT)((float)heap_surviving_size / regular_survive_ratio);
+  new_heap_total_size = round_down_to_size(new_heap_total_size, SPACE_ALLOC_UNIT);
+
+
+  if(new_heap_total_size <= heap_total_size) return;
+  if(new_heap_total_size > max_heap_size_bytes) 
+    new_heap_total_size = max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL;
+
+  adjust_size = new_heap_total_size - heap_total_size;
+  assert( !(adjust_size % SPACE_ALLOC_UNIT) );
+  
+#ifdef STATIC_NOS_MAPPING
+  /*Fixme: Static mapping have other bugs to be fixed first.*/
+  assert(!large_page_hint);
+  return;
+#else
+  assert(!large_page_hint);
+  POINTER_SIZE_INT old_nos_size = nos->committed_heap_size;
+  blocked_space_extend(nos, adjust_size);
+  nos->survive_ratio = (float)old_nos_size * nos->survive_ratio / (float)nos->committed_heap_size;
+  /*Fixme: gc should be modified according to nos extend*/
+  gc->committed_heap_size += adjust_size;
+  assert(gc->committed_heap_size == los->committed_heap_size + mos->committed_heap_size + nos->committed_heap_size);
+#endif
+}
+
 Boolean IS_FALLBACK_COMPACTION = FALSE; /* only for debugging, don't use it. */
 
 void gc_gen_reclaim_heap(GC_Gen* gc)
@@ -361,41 +418,31 @@
   if(gc_match_kind((GC*)gc, MINOR_COLLECTION)){
     /* FIXME:: move_object is only useful for nongen_slide_copy */
     gc->mos->move_object = FALSE;
-    
     fspace_collection(gc->nos);
-    
     gc->mos->move_object = TRUE;      
-
-      
   }else{
-
     /* process mos and nos together in one compaction */
     mspace_collection(gc->mos); /* fspace collection is included */
     lspace_collection(gc->los);
-
   }
 
   if(gc->collect_result == FALSE && gc_match_kind((GC*)gc, MINOR_COLLECTION)){
-    if(gc_is_gen_mode())
-      gc_clear_remset((GC*)gc);  
+    if(gc_is_gen_mode()) gc_clear_remset((GC*)gc);  
     
     /* runout mspace in minor collection */
     assert(mspace->free_block_idx == mspace->ceiling_block_idx + 1);
     mspace->num_used_blocks = mspace->num_managed_blocks;
 
     IS_FALLBACK_COMPACTION = TRUE;
-
     gc_reset_collect_result((GC*)gc);
     gc->collect_kind = FALLBACK_COLLECTION;    
 
-    if(verify_live_heap)
-      event_gc_collect_kind_changed((GC*)gc);
+    if(verify_live_heap) event_gc_collect_kind_changed((GC*)gc);
 
     mspace_collection(gc->mos); /* fspace collection is included */
     lspace_collection(gc->los);
     
     IS_FALLBACK_COMPACTION = FALSE;
-    
   }
   
   if( gc->collect_result == FALSE){
@@ -412,7 +459,6 @@
 #endif
 
   assert(!gc->los->move_object);
-
   return;
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h Fri May 11 01:14:50 2007
@@ -169,6 +169,8 @@
 void gc_gen_reclaim_heap(GC_Gen* gc);
 
 void gc_gen_assign_free_area_to_mutators(GC_Gen* gc);
+
+void gc_gen_adjust_heap_size(GC_Gen* gc);
   
 void gc_gen_mode_adapt_init(GC_Gen *gc);
 
@@ -177,5 +179,6 @@
 extern Boolean GEN_NONGEN_SWITCH ;
 
 #endif /* ifndef _GC_GEN_H_ */
+
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp Fri May 11 01:14:50 2007
@@ -25,8 +25,6 @@
 #define NOS_COPY_RESERVE_DELTA (GC_BLOCK_SIZE_BYTES<<1)
 /*Tune this number in case that MOS could be too small, so as to avoid or put off fall back.*/
 #define GC_MOS_MIN_EXTRA_REMAIN_SIZE (36*MB)
-/*Switch on this MACRO when we want lspace->survive_ratio to be sensitive.*/
-//#define NOS_SURVIVE_RATIO_SENSITIVE
 
 struct Mspace;
 void mspace_set_expected_threshold(Mspace* mspace, POINTER_SIZE_INT threshold);
@@ -213,8 +211,8 @@
       
       /*If major is caused by LOS, or collection kind is EXTEND_COLLECTION, all survive ratio is not updated.*/
       if((gc->cause != GC_CAUSE_LOS_IS_FULL) && (!gc_match_kind((GC*)gc, EXTEND_COLLECTION))){
-        POINTER_SIZE_INT major_survive_size = space_committed_size((Space*)mspace) - mos_free_size;
-        survive_ratio = (float)major_survive_size/(float)space_committed_size((Space*)mspace);
+        POINTER_SIZE_INT major_surviving_size = space_committed_size((Space*)mspace) - mos_free_size;
+        survive_ratio = (float)major_surviving_size/(float)space_committed_size((Space*)mspace);
         mspace->survive_ratio = survive_ratio;
       }
       /*For LOS_Shrink:*/
@@ -222,15 +220,10 @@
         POINTER_SIZE_INT mspace_size_threshold = (space_committed_size((Space*)mspace) + space_committed_size((Space*)fspace)) >> 1;
         mspace_set_expected_threshold((Mspace *)mspace, mspace_size_threshold );
       }
-  #ifdef NOS_SURVIVE_RATIO_SENSITIVE
-      /*If this major is caused by fall back compaction, 
-         we must give fspace->survive_ratio a conservative and reasonable number to avoid next fall back.*/
-      //fspace->survive_ratio = mspace->survive_ratio;
-      /*In fallback compaction, the survive_ratio of mspace must be 1.*/
-      if(gc_match_kind((GC*)gc, FALLBACK_COLLECTION))
-      	fspace->survive_ratio = 1;
-      	
-  #endif
+      /*If this major is caused by fall back compaction, we must give fspace->survive_ratio 
+        *a conservative and reasonable number to avoid next fall back.
+        *In fallback compaction, the survive_ratio of mspace must be 1.*/
+      if(gc_match_kind((GC*)gc, FALLBACK_COLLECTION)) fspace->survive_ratio = 1;
     }else{
       /*Give a hint to mini_free_ratio. */
       if(fspace->num_collections == 1){
@@ -242,19 +235,17 @@
   
       fspace->time_collections += pause_time;  
       POINTER_SIZE_INT free_size_threshold;
-        
-      POINTER_SIZE_INT minor_survive_size = last_total_free_size - total_free_size;
+
+      POINTER_SIZE_INT minor_surviving_size = last_total_free_size - total_free_size;
   
       float k = Tslow * fspace->num_collections/fspace->time_collections;
-      float m = ((float)minor_survive_size)*1.0f/((float)(SMax - GC_MOS_MIN_EXTRA_REMAIN_SIZE ));
+      float m = ((float)minor_surviving_size)*1.0f/((float)(SMax - GC_MOS_MIN_EXTRA_REMAIN_SIZE ));
       float free_ratio_threshold = mini_free_ratio(k, m);
       free_size_threshold = (POINTER_SIZE_INT)(free_ratio_threshold * (SMax - GC_MOS_MIN_EXTRA_REMAIN_SIZE ) + GC_MOS_MIN_EXTRA_REMAIN_SIZE );
   
-      if ((mos_free_size + nos_free_size)< free_size_threshold)  {
-        gc->force_major_collect = TRUE;
-      }
+      if ((mos_free_size + nos_free_size)< free_size_threshold) gc->force_major_collect = TRUE;
   
-      survive_ratio = (float)minor_survive_size/(float)space_committed_size((Space*)fspace);
+      survive_ratio = (float)minor_surviving_size/(float)space_committed_size((Space*)fspace);
       fspace->survive_ratio = survive_ratio;
       /*For LOS_Adaptive*/
       POINTER_SIZE_INT mspace_committed_size = space_committed_size((Space*)mspace);
@@ -265,9 +256,8 @@
         mspace_set_expected_threshold((Mspace *)mspace, mspace_size_threshold );
       }
     }
-    
-    gc->survive_ratio =  (gc->survive_ratio + survive_ratio)/2.0f;
   
+    gc->survive_ratio =  (gc->survive_ratio + survive_ratio)/2.0f;
     last_total_free_size = total_free_size;
   }
 
@@ -295,7 +285,9 @@
 #ifdef STATIC_NOS_MAPPING
     total_size = max_heap_size_bytes - lspace->committed_heap_size;
 #else
-    total_size = (POINTER_SIZE_INT)gc->heap_end - (POINTER_SIZE_INT)mspace->heap_start;
+    POINTER_SIZE_INT curr_heap_commit_end = 
+                              (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_NULL + gc->committed_heap_size;
+    total_size = curr_heap_commit_end - (POINTER_SIZE_INT)mspace->heap_start;
 #endif
 
   POINTER_SIZE_INT total_free = total_size - used_mos_size;
@@ -306,16 +298,15 @@
   POINTER_SIZE_INT nos_reserve_size;
   nos_reserve_size = (POINTER_SIZE_INT)(((float)total_free)/(1.0f + fspace->survive_ratio));
   /*NOS should not be zero, if there is only one block in non-los, i.e. in the former if sentence,
-    if total_free = GC_BLOCK_SIZE_BYTES, then the computed nos_reserve_size is between zero
-    and GC_BLOCK_SIZE_BYTES. In this case, we assign this block to NOS*/
+    *if total_free = GC_BLOCK_SIZE_BYTES, then the computed nos_reserve_size is between zero
+    *and GC_BLOCK_SIZE_BYTES. In this case, we assign this block to NOS*/
   if(nos_reserve_size <= GC_BLOCK_SIZE_BYTES)  nos_reserve_size = GC_BLOCK_SIZE_BYTES;
 
 #ifdef STATIC_NOS_MAPPING
   if(nos_reserve_size > fspace->reserved_heap_size) nos_reserve_size = fspace->reserved_heap_size;
 #endif  
-  //To reserve some MOS space to avoid fallback situation. 
-  //But we need ensure nos has at least one block 
-  //if(new_nos_size > GC_MOS_MIN_EXTRA_REMAIN_SIZE) new_nos_size -= GC_MOS_MIN_EXTRA_REMAIN_SIZE ;
+  /*To reserve some MOS space to avoid fallback situation. 
+   *But we need ensure nos has at least one block */
   POINTER_SIZE_INT reserve_in_mos = GC_MOS_MIN_EXTRA_REMAIN_SIZE;
   while (reserve_in_mos >= GC_BLOCK_SIZE_BYTES){
     if(nos_reserve_size >= reserve_in_mos + GC_BLOCK_SIZE_BYTES){
@@ -342,7 +333,6 @@
 }
 
 #ifndef STATIC_NOS_MAPPING
-
 void gc_gen_adapt(GC_Gen* gc, int64 pause_time)
 {
   gc_decide_next_collect(gc, pause_time);
@@ -366,8 +356,9 @@
     return;
   
   /* below are ajustment */  
-
-  nos_boundary = (void*)((POINTER_SIZE_INT)gc->heap_end - new_nos_size);
+  POINTER_SIZE_INT curr_heap_commit_end = 
+                             (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_NULL + gc->committed_heap_size;
+  nos_boundary = (void*)(curr_heap_commit_end - new_nos_size);
 
   fspace->heap_start = nos_boundary;
   fspace->blocks = (Block*)nos_boundary;
@@ -394,8 +385,8 @@
   return;
 }
 
-#else /* ifndef STATIC_NOS_MAPPING */
-
+/* ifdef STATIC_NOS_MAPPING */
+#else
 void gc_gen_adapt(GC_Gen* gc, int64 pause_time)
 {
   gc_decide_next_collect(gc, pause_time);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp Fri May 11 01:14:50 2007
@@ -357,16 +357,7 @@
   if( ++old_num == num_active_collectors ){
     /* last collector's world here */
     /*Retune space tuner to insure the tuning size is not to great*/
-//    Boolean retune_result;
     if(gc->tuner->kind != TRANS_NOTHING) gc_space_retune(gc);
-//    if(gc->tuner->kind == TRANS_FROM_LOS_TO_MOS) printf("los shrink...\n");
-//    if(gc->tuner->kind == TRANS_FROM_MOS_TO_LOS) printf("los extend...\n");
-    
-/*    if(!retune_result){
-      gc->collect_result = FALSE;
-      num_marking_collectors++; 
-      return;
-    }*/
     
     assert(!(gc->tuner->tuning_size % GC_BLOCK_SIZE_BYTES));
     /* prepare for next phase */

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.h?view=diff&rev=537127&r1=537126&r2=537127
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.h Fri May 11 01:14:50 2007
@@ -27,9 +27,9 @@
 
 /*Fixme: This macro is for handling HEAP_NULL issues caused by JIT OPT*/
 #ifdef COMPRESS_REFERENCE
-  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL (GC_BLOCK_SIZE_BYTES )
+  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL ( SPACE_ALLOC_UNIT )
 #else
-  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL (0*KB)
+  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL ( 0*KB )
 #endif
 
 typedef struct Lspace{