1 /*
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
865 } else {
866 Universe::set_narrow_oop_base(0);
867 #ifdef _WIN64
868 if (!Universe::narrow_oop_use_implicit_null_checks()) {
869 // Don't need guard page for implicit checks in indexed addressing
870 // mode with zero based Compressed Oops.
871 Universe::set_narrow_oop_use_implicit_null_checks(true);
872 }
873 #endif // _WIN64
874 if((uint64_t)Universe::heap()->reserved_region().end() > UnscaledOopHeapMax) {
875 // Can't reserve heap below 4Gb.
876 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
877 } else {
878 Universe::set_narrow_oop_shift(0);
879 }
880 }
881
882 Universe::set_narrow_ptrs_base(Universe::narrow_oop_base());
883
884 if (PrintCompressedOopsMode || (PrintMiscellaneous && Verbose)) {
885 Universe::print_compressed_oops_mode();
886 }
887 }
888 // Universe::narrow_oop_base() is one page below the heap.
889 assert((intptr_t)Universe::narrow_oop_base() <= (intptr_t)(Universe::heap()->base() -
890 os::vm_page_size()) ||
891 Universe::narrow_oop_base() == NULL, "invalid value");
892 assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
893 Universe::narrow_oop_shift() == 0, "invalid value");
894 #endif
895
896 // We will never reach the CATCH below since Exceptions::_throw will cause
897 // the VM to exit if an exception is thrown during initialization
898
899 if (UseTLAB) {
900 assert(Universe::heap()->supports_tlab_allocation(),
901 "Should support thread-local allocation buffers");
902 ThreadLocalAllocBuffer::startup_initialization();
903 }
904 return JNI_OK;
905 }
906
907 void Universe::print_compressed_oops_mode() {
908 tty->cr();
909 tty->print("heap address: " PTR_FORMAT ", size: " SIZE_FORMAT " MB",
910 Universe::heap()->base(), Universe::heap()->reserved_region().byte_size()/M);
911
912 tty->print(", Compressed Oops mode: %s", narrow_oop_mode_to_string(narrow_oop_mode()));
913
914 if (Universe::narrow_oop_base() != 0) {
915 tty->print(":" PTR_FORMAT, Universe::narrow_oop_base());
916 }
917
918 if (Universe::narrow_oop_shift() != 0) {
919 tty->print(", Oop shift amount: %d", Universe::narrow_oop_shift());
920 }
921
922 tty->cr();
923 tty->cr();
924 }
925
926 // Reserve the Java heap, which is now the same for all GCs.
927 ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
928 assert(alignment <= Arguments::conservative_max_heap_alignment(),
929 err_msg("actual alignment "SIZE_FORMAT" must be within maximum heap alignment "SIZE_FORMAT,
930 alignment, Arguments::conservative_max_heap_alignment()));
931 size_t total_reserved = align_size_up(heap_size, alignment);
932 assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())),
933 "heap size is too big for compressed oops");
934
935 bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size());
936 assert(!UseLargePages
937 || UseParallelGC
938 || use_large_pages, "Wrong alignment to use large pages");
939
940 char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop);
941
942 ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, addr);
943
|
1 /*
2 * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
865 } else {
866 Universe::set_narrow_oop_base(0);
867 #ifdef _WIN64
868 if (!Universe::narrow_oop_use_implicit_null_checks()) {
869 // Don't need guard page for implicit checks in indexed addressing
870 // mode with zero based Compressed Oops.
871 Universe::set_narrow_oop_use_implicit_null_checks(true);
872 }
873 #endif // _WIN64
874 if((uint64_t)Universe::heap()->reserved_region().end() > UnscaledOopHeapMax) {
875 // Can't reserve heap below 4Gb.
876 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
877 } else {
878 Universe::set_narrow_oop_shift(0);
879 }
880 }
881
882 Universe::set_narrow_ptrs_base(Universe::narrow_oop_base());
883
884 if (PrintCompressedOopsMode || (PrintMiscellaneous && Verbose)) {
885 Universe::print_compressed_oops_mode(tty);
886 }
887 }
888 // Universe::narrow_oop_base() is one page below the heap.
889 assert((intptr_t)Universe::narrow_oop_base() <= (intptr_t)(Universe::heap()->base() -
890 os::vm_page_size()) ||
891 Universe::narrow_oop_base() == NULL, "invalid value");
892 assert(Universe::narrow_oop_shift() == LogMinObjAlignmentInBytes ||
893 Universe::narrow_oop_shift() == 0, "invalid value");
894 #endif
895
896 // We will never reach the CATCH below since Exceptions::_throw will cause
897 // the VM to exit if an exception is thrown during initialization
898
899 if (UseTLAB) {
900 assert(Universe::heap()->supports_tlab_allocation(),
901 "Should support thread-local allocation buffers");
902 ThreadLocalAllocBuffer::startup_initialization();
903 }
904 return JNI_OK;
905 }
906
907 void Universe::print_compressed_oops_mode(outputStream* st) {
908 st->print("heap address: " PTR_FORMAT ", size: " SIZE_FORMAT " MB",
909 Universe::heap()->base(), Universe::heap()->reserved_region().byte_size()/M);
910
911 st->print(", Compressed Oops mode: %s", narrow_oop_mode_to_string(narrow_oop_mode()));
912
913 if (Universe::narrow_oop_base() != 0) {
914 st->print(":" PTR_FORMAT, Universe::narrow_oop_base());
915 }
916
917 if (Universe::narrow_oop_shift() != 0) {
918 st->print(", Oop shift amount: %d", Universe::narrow_oop_shift());
919 }
920
921 st->cr();
922 }
923
924 // Reserve the Java heap, which is now the same for all GCs.
925 ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
926 assert(alignment <= Arguments::conservative_max_heap_alignment(),
927 err_msg("actual alignment "SIZE_FORMAT" must be within maximum heap alignment "SIZE_FORMAT,
928 alignment, Arguments::conservative_max_heap_alignment()));
929 size_t total_reserved = align_size_up(heap_size, alignment);
930 assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())),
931 "heap size is too big for compressed oops");
932
933 bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size());
934 assert(!UseLargePages
935 || UseParallelGC
936 || use_large_pages, "Wrong alignment to use large pages");
937
938 char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop);
939
940 ReservedHeapSpace total_rs(total_reserved, alignment, use_large_pages, addr);
941
|