blob: d8c8dbb32595fb4e0f3658d7dc1afb2c5b6d63bd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Xiao-Feng Li, 2006/10/05
*/
#ifndef _SPACE_TUNER_H_
#define _SPACE_TUNER_H_
#include "gc_common.h"
#include "gc_space.h"
#define GC_LOS_MIN_VARY_SIZE ( 2 * MB )
//#define GC_FIXED_SIZE_TUNER
extern POINTER_SIZE_INT max_heap_size_bytes;
//For_LOS_extend
enum Transform_Kind {
TRANS_NOTHING = 0,
TRANS_FROM_LOS_TO_MOS = 0x1,
TRANS_FROM_MOS_TO_LOS = 0x2,
};
typedef struct Space_Tuner{
Transform_Kind kind;
/*This flags is set if the tuning direction changes in the process of tuning*/
Boolean reverse;
POINTER_SIZE_INT tuning_size;
/*Used for LOS_Shrink*/
Block_Header* interim_blocks;
/*This flag is set when tuning strategy decide to tune los size.
*i.e. wasted memory is greater than wast_threshold. */
Boolean need_tune;
/*This flag is set if gc is caused by los alloc failure.*/
Boolean force_tune;
uint64 speed_los;
uint64 last_speed_los;
uint64 speed_mos;
uint64 last_speed_mos;
uint64 speed_nos;
uint64 last_speed_nos;
/*Total wasted memory of los science last los variation*/
uint64 wast_los;
/*Total wasted memory of mos science last los variation*/
uint64 wast_mos;
uint64 current_dw;
/*NOS survive size of last minor, this could be the least meaningful space unit when talking about tuning.*/
POINTER_SIZE_INT current_ds;
/*Threshold for deta waste*/
POINTER_SIZE_INT threshold_waste;
/*Minimun tuning size for los variation*/
POINTER_SIZE_INT min_tuning_size;
}Space_Tuner;
void gc_compute_space_tune_size_before_marking(GC* gc);
void gc_compute_space_tune_size_after_marking(GC *gc);
void gc_space_tuner_reset(GC* gc);
void gc_space_tuner_initialize(GC* gc);
void gc_space_tuner_init_fake_blocks_for_los_shrink(GC* gc);
void gc_space_tuner_release_fake_blocks_for_los_shrink(GC* gc);
inline Boolean gc_has_space_tuner(GC* gc)
{ return (Boolean)(POINTER_SIZE_INT)gc->tuner; }
#endif /* _SPACE_TUNER_H_ */