< prev index next >

src/hotspot/os_cpu/linux_x86/gc/z/zPhysicalMemoryBacking_linux_x86.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 23,32 **** --- 23,33 ---- #include "precompiled.hpp" #include "gc/z/zAddress.inline.hpp" #include "gc/z/zBackingFile_linux_x86.hpp" #include "gc/z/zErrno.hpp" + #include "gc/z/zGlobals.hpp" #include "gc/z/zLargePages.inline.hpp" #include "gc/z/zMemory.hpp" #include "gc/z/zNUMA.hpp" #include "gc/z/zPhysicalMemory.inline.hpp" #include "gc/z/zPhysicalMemoryBacking_linux_x86.hpp"
*** 45,71 **** #endif // Proc file entry for max map mount #define ZFILENAME_PROC_MAX_MAP_COUNT "/proc/sys/vm/max_map_count" ! ZPhysicalMemoryBacking::ZPhysicalMemoryBacking(size_t max_capacity, size_t granule_size) : _manager(), ! _file(), ! _granule_size(granule_size) { if (!_file.is_initialized()) { return; } // Check and warn if max map count is too low ! check_max_map_count(max_capacity, granule_size); // Check and warn if available space on filesystem is too low check_available_space_on_filesystem(max_capacity); } ! void ZPhysicalMemoryBacking::check_max_map_count(size_t max_capacity, size_t granule_size) const { const char* const filename = ZFILENAME_PROC_MAX_MAP_COUNT; FILE* const file = fopen(filename, "r"); if (file == NULL) { // Failed to open file, skip check log_debug(gc, init)("Failed to open %s", filename); --- 46,71 ---- #endif // Proc file entry for max map mount #define ZFILENAME_PROC_MAX_MAP_COUNT "/proc/sys/vm/max_map_count" ! ZPhysicalMemoryBacking::ZPhysicalMemoryBacking(size_t max_capacity) : _manager(), ! _file() { if (!_file.is_initialized()) { return; } // Check and warn if max map count is too low ! check_max_map_count(max_capacity); // Check and warn if available space on filesystem is too low check_available_space_on_filesystem(max_capacity); } ! void ZPhysicalMemoryBacking::check_max_map_count(size_t max_capacity) const { const char* const filename = ZFILENAME_PROC_MAX_MAP_COUNT; FILE* const file = fopen(filename, "r"); if (file == NULL) { // Failed to open file, skip check log_debug(gc, init)("Failed to open %s", filename);
*** 84,94 **** // The required max map count is impossible to calculate exactly since subsystems // other than ZGC are also creating memory mappings, and we have no control over that. // However, ZGC tends to create the most mappings and dominate the total count. // In the worst cases, ZGC will map each granule three times, i.e. once per heap view. // We speculate that we need another 20% to allow for non-ZGC subsystems to map memory. ! const size_t required_max_map_count = (max_capacity / granule_size) * 3 * 1.2; if (actual_max_map_count < required_max_map_count) { log_warning(gc, init)("***** WARNING! INCORRECT SYSTEM CONFIGURATION DETECTED! *****"); log_warning(gc, init)("The system limit on number of memory mappings per process might be too low " "for the given"); log_warning(gc, init)("max Java heap size (" SIZE_FORMAT "M). Please adjust %s to allow for at", --- 84,94 ---- // The required max map count is impossible to calculate exactly since subsystems // other than ZGC are also creating memory mappings, and we have no control over that. // However, ZGC tends to create the most mappings and dominate the total count. // In the worst cases, ZGC will map each granule three times, i.e. once per heap view. // We speculate that we need another 20% to allow for non-ZGC subsystems to map memory. ! const size_t required_max_map_count = (max_capacity / ZGranuleSize) * 3 * 1.2; if (actual_max_map_count < required_max_map_count) { log_warning(gc, init)("***** WARNING! INCORRECT SYSTEM CONFIGURATION DETECTED! *****"); log_warning(gc, init)("The system limit on number of memory mappings per process might be too low " "for the given"); log_warning(gc, init)("max Java heap size (" SIZE_FORMAT "M). Please adjust %s to allow for at",
*** 133,161 **** } size_t ZPhysicalMemoryBacking::try_expand(size_t old_capacity, size_t new_capacity) { assert(old_capacity < new_capacity, "Invalid old/new capacity"); ! const size_t capacity = _file.try_expand(old_capacity, new_capacity - old_capacity, _granule_size); if (capacity > old_capacity) { // Add expanded capacity to free list _manager.free(old_capacity, capacity - old_capacity); } return capacity; } ZPhysicalMemory ZPhysicalMemoryBacking::alloc(size_t size) { ! assert(is_aligned(size, _granule_size), "Invalid size"); ZPhysicalMemory pmem; // Allocate segments ! for (size_t allocated = 0; allocated < size; allocated += _granule_size) { ! const uintptr_t start = _manager.alloc_from_front(_granule_size); assert(start != UINTPTR_MAX, "Allocation should never fail"); ! pmem.add_segment(ZPhysicalMemorySegment(start, _granule_size)); } return pmem; } --- 133,161 ---- } size_t ZPhysicalMemoryBacking::try_expand(size_t old_capacity, size_t new_capacity) { assert(old_capacity < new_capacity, "Invalid old/new capacity"); ! const size_t capacity = _file.try_expand(old_capacity, new_capacity - old_capacity, ZGranuleSize); if (capacity > old_capacity) { // Add expanded capacity to free list _manager.free(old_capacity, capacity - old_capacity); } return capacity; } ZPhysicalMemory ZPhysicalMemoryBacking::alloc(size_t size) { ! assert(is_aligned(size, ZGranuleSize), "Invalid size"); ZPhysicalMemory pmem; // Allocate segments ! for (size_t allocated = 0; allocated < size; allocated += ZGranuleSize) { ! const uintptr_t start = _manager.alloc_from_front(ZGranuleSize); assert(start != UINTPTR_MAX, "Allocation should never fail"); ! pmem.add_segment(ZPhysicalMemorySegment(start, ZGranuleSize)); } return pmem; }
< prev index next >