use super::convert::convert_bytes_to_mb;
pub fn get_g1_target_millis(gc_flags: &Vec<String>) -> i32 {
for flag in gc_flags {
if flag.starts_with("-XX:MaxGCPauseMillis=") {
let o = flag
.strip_prefix("-XX:MaxGCPauseMillis=")
.expect("unable to remove -XX:MaxGCPauseMillis= prefix");
return o.parse().expect("unable to parse string");
}
}
200
}
pub fn get_g1_gc_region_size_mb(min_heap_gb: f32, gc_flags: &Vec<String>) -> f32 {
for flag in gc_flags {
if flag.starts_with("-XX:G1HeapRegionSize=") {
let o = flag
.strip_prefix("-XX:G1HeapRegionSize=")
.expect("unable to remove -XX:G1HeapRegionSize= prefix");
let region_size = o.parse().expect("unable to parse string");
return convert_bytes_to_mb(region_size);
}
}
get_region_for_heap(min_heap_gb)
}
fn get_region_for_heap(min_heap_gb: f32) -> f32 {
let heap_bytes = min_heap_gb * 1024.0 * 1024.0 * 1024.0;
let region_size = heap_bytes / 2048.0;
let region_size_in_mb = region_size / (1024.0 * 1024.0);
if region_size_in_mb < 2.0 {
return 1.0;
} else if region_size_in_mb > 2.0 && region_size_in_mb < 4.0 {
return 2.0;
} else if region_size_in_mb > 4.0 && region_size_in_mb < 8.0 {
return 4.0;
} else if region_size_in_mb > 8.0 && region_size_in_mb < 16.0 {
return 8.0;
} else if region_size_in_mb > 16.0 && region_size_in_mb < 32.0 {
return 16.0;
}
32.0
}
#[cfg(test)]
mod tests {
use std::vec;
use crate::{
glog::g1gc::{get_g1_gc_region_size_mb, get_g1_target_millis, get_region_for_heap},
tests::assert_approx_equal,
};
#[test]
fn test_get_target_millis() {
let default_target_millis = get_g1_target_millis(&vec!["".to_string()]);
assert_eq!(default_target_millis, 200);
let target_millis_with_flag = get_g1_target_millis(&vec![
"".to_string(),
"-XX:MaxGCPauseMillis=500".to_string(),
"".to_string(),
]);
assert_eq!(target_millis_with_flag, 500);
}
#[test]
fn test_get_g1_gc_region_size_mb() {
let region_size = get_g1_gc_region_size_mb(
0.0,
&vec!["-XX:G1HeapRegionSize=33554432".to_string(), "".to_string()],
);
assert_approx_equal(region_size, 32.0, 0.01);
}
#[test]
fn test_get_g1_gc_region_size_mb_impossible_size() {
let region_size = get_g1_gc_region_size_mb(
0.0,
&vec!["-XX:G1HeapRegionSize=32000000".to_string(), "".to_string()],
);
assert_approx_equal(region_size, 30.51, 0.01);
}
#[test]
fn test_get_g1_gc_region_size_mb_with_no_region_size() {
let region_size = get_g1_gc_region_size_mb(64.0, &vec!["".to_string(), "".to_string()]);
assert_approx_equal(region_size, 32.0, 0.01);
}
#[test]
fn test_default_g1gc_region_size() {
assert_approx_equal(get_region_for_heap(1.0), 1.0, 0.01);
assert_approx_equal(get_region_for_heap(4.01), 2.0, 0.01);
assert_approx_equal(get_region_for_heap(8.01), 4.0, 0.01);
assert_approx_equal(get_region_for_heap(16.01), 8.0, 0.01);
assert_approx_equal(get_region_for_heap(32.01), 16.0, 0.01);
assert_approx_equal(get_region_for_heap(64.01), 32.0, 0.01);
assert_approx_equal(get_region_for_heap(128.01), 32.0, 0.01);
}
}