1741 // with narrow class pointers.
1742 // We reserve the whole range spanning both spaces, then split that range up.
1743
1744 const size_t class_space_alignment = Metaspace::reserve_alignment();
1745
1746 // When running with class space, requested archive base must satisfy both cds core alignment
1747 // and class space alignment.
1748 const size_t base_address_alignment = MAX2(class_space_alignment, archive_space_alignment);
1749 assert(is_aligned(base_address, base_address_alignment),
1750 "Archive base address unaligned: " PTR_FORMAT ", needs alignment: %zu.",
1751 p2i(base_address), base_address_alignment);
1752
1753 size_t class_space_size = CompressedClassSpaceSize;
1754 assert(CompressedClassSpaceSize > 0 &&
1755 is_aligned(CompressedClassSpaceSize, class_space_alignment),
1756 "CompressedClassSpaceSize malformed: %zu", CompressedClassSpaceSize);
1757
1758 const size_t ccs_begin_offset = align_up(archive_space_size, class_space_alignment);
1759 const size_t gap_size = ccs_begin_offset - archive_space_size;
1760
1761 // Reduce class space size if it would not fit into the Klass encoding range
1762 constexpr size_t max_encoding_range_size = 4 * G;
1763 guarantee(archive_space_size < max_encoding_range_size - class_space_alignment, "Archive too large");
1764 if ((archive_space_size + gap_size + class_space_size) > max_encoding_range_size) {
1765 class_space_size = align_down(max_encoding_range_size - archive_space_size - gap_size, class_space_alignment);
1766 log_info(metaspace)("CDS initialization: reducing class space size from %zu to %zu",
1767 CompressedClassSpaceSize, class_space_size);
1768 FLAG_SET_ERGO(CompressedClassSpaceSize, class_space_size);
1769 }
1770
1771 const size_t total_range_size =
1772 archive_space_size + gap_size + class_space_size;
1773
1774 // Test that class space base address plus shift can be decoded by aarch64, when restored.
1775 const int precomputed_narrow_klass_shift = ArchiveBuilder::precomputed_narrow_klass_shift();
1776 if (!CompressedKlassPointers::check_klass_decode_mode(base_address, precomputed_narrow_klass_shift,
1777 total_range_size)) {
1778 aot_log_info(aot)("CDS initialization: Cannot use SharedBaseAddress " PTR_FORMAT " with precomputed shift %d.",
1779 p2i(base_address), precomputed_narrow_klass_shift);
1780 use_archive_base_addr = false;
1781 }
1782
|
1741 // with narrow class pointers.
1742 // We reserve the whole range spanning both spaces, then split that range up.
1743
1744 const size_t class_space_alignment = Metaspace::reserve_alignment();
1745
1746 // When running with class space, requested archive base must satisfy both cds core alignment
1747 // and class space alignment.
1748 const size_t base_address_alignment = MAX2(class_space_alignment, archive_space_alignment);
1749 assert(is_aligned(base_address, base_address_alignment),
1750 "Archive base address unaligned: " PTR_FORMAT ", needs alignment: %zu.",
1751 p2i(base_address), base_address_alignment);
1752
1753 size_t class_space_size = CompressedClassSpaceSize;
1754 assert(CompressedClassSpaceSize > 0 &&
1755 is_aligned(CompressedClassSpaceSize, class_space_alignment),
1756 "CompressedClassSpaceSize malformed: %zu", CompressedClassSpaceSize);
1757
1758 const size_t ccs_begin_offset = align_up(archive_space_size, class_space_alignment);
1759 const size_t gap_size = ccs_begin_offset - archive_space_size;
1760
1761 // Reduce class space size if it would not fit into the maximum possible Klass encoding range. That
1762 // range is defined by the narrowKlass size.
1763 const size_t max_encoding_range_size = CompressedKlassPointers::max_klass_range_size();
1764 guarantee(archive_space_size < max_encoding_range_size - class_space_alignment, "Archive too large");
1765 if ((archive_space_size + gap_size + class_space_size) > max_encoding_range_size) {
1766 class_space_size = align_down(max_encoding_range_size - archive_space_size - gap_size, class_space_alignment);
1767 log_info(metaspace)("CDS initialization: reducing class space size from %zu to %zu",
1768 CompressedClassSpaceSize, class_space_size);
1769 FLAG_SET_ERGO(CompressedClassSpaceSize, class_space_size);
1770 }
1771
1772 const size_t total_range_size =
1773 archive_space_size + gap_size + class_space_size;
1774
1775 // Test that class space base address plus shift can be decoded by aarch64, when restored.
1776 const int precomputed_narrow_klass_shift = ArchiveBuilder::precomputed_narrow_klass_shift();
1777 if (!CompressedKlassPointers::check_klass_decode_mode(base_address, precomputed_narrow_klass_shift,
1778 total_range_size)) {
1779 aot_log_info(aot)("CDS initialization: Cannot use SharedBaseAddress " PTR_FORMAT " with precomputed shift %d.",
1780 p2i(base_address), precomputed_narrow_klass_shift);
1781 use_archive_base_addr = false;
1782 }
1783
|