46 delete _mangler;
47 }
48
49 void MutableSpace::numa_setup_pages(MemRegion mr, bool clear_space) {
50 if (!mr.is_empty()) {
51 size_t page_size = UseLargePages ? alignment() : os::vm_page_size();
52 HeapWord *start = (HeapWord*)round_to((intptr_t) mr.start(), page_size);
53 HeapWord *end = (HeapWord*)round_down((intptr_t) mr.end(), page_size);
54 if (end > start) {
55 size_t size = pointer_delta(end, start, sizeof(char));
56 if (clear_space) {
57 // Prefer page reallocation to migration.
58 os::free_memory((char*)start, size, page_size);
59 }
60 os::numa_make_global((char*)start, size);
61 }
62 }
63 }
64
65 void MutableSpace::pretouch_pages(MemRegion mr) {
66 for (volatile char *p = (char*)mr.start(); p < (char*)mr.end(); p += os::vm_page_size()) {
67 char t = *p; *p = t;
68 }
69 }
70
71 void MutableSpace::initialize(MemRegion mr,
72 bool clear_space,
73 bool mangle_space,
74 bool setup_pages) {
75
76 assert(Universe::on_page_boundary(mr.start()) && Universe::on_page_boundary(mr.end()),
77 "invalid space boundaries");
78
79 if (setup_pages && (UseNUMA || AlwaysPreTouch)) {
80 // The space may move left and right or expand/shrink.
81 // We'd like to enforce the desired page placement.
82 MemRegion head, tail;
83 if (last_setup_region().is_empty()) {
84 // If it's the first initialization don't limit the amount of work.
85 head = mr;
86 tail = MemRegion(mr.end(), mr.end());
87 } else {
88 // Is there an intersection with the address space?
|
46 delete _mangler;
47 }
48
49 void MutableSpace::numa_setup_pages(MemRegion mr, bool clear_space) {
50 if (!mr.is_empty()) {
51 size_t page_size = UseLargePages ? alignment() : os::vm_page_size();
52 HeapWord *start = (HeapWord*)round_to((intptr_t) mr.start(), page_size);
53 HeapWord *end = (HeapWord*)round_down((intptr_t) mr.end(), page_size);
54 if (end > start) {
55 size_t size = pointer_delta(end, start, sizeof(char));
56 if (clear_space) {
57 // Prefer page reallocation to migration.
58 os::free_memory((char*)start, size, page_size);
59 }
60 os::numa_make_global((char*)start, size);
61 }
62 }
63 }
64
65 void MutableSpace::pretouch_pages(MemRegion mr) {
66 os::pretouch_memory((char*)mr.start(), (char*)mr.end());
67 }
68
69 void MutableSpace::initialize(MemRegion mr,
70 bool clear_space,
71 bool mangle_space,
72 bool setup_pages) {
73
74 assert(Universe::on_page_boundary(mr.start()) && Universe::on_page_boundary(mr.end()),
75 "invalid space boundaries");
76
77 if (setup_pages && (UseNUMA || AlwaysPreTouch)) {
78 // The space may move left and right or expand/shrink.
79 // We'd like to enforce the desired page placement.
80 MemRegion head, tail;
81 if (last_setup_region().is_empty()) {
82 // If it's the first initialization don't limit the amount of work.
83 head = mr;
84 tail = MemRegion(mr.end(), mr.end());
85 } else {
86 // Is there an intersection with the address space?
|