size_t CollectorPolicy::compute_heap_alignment() { // The card marking array and the offset arrays for old generations are // committed in os pages as well. Make sure they are entirely full (to // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1 // byte entry and the os page size is 4096, the maximum heap size should // be 512*4096 = 2MB aligned. // There is only the GenRemSet in Hotspot and only the GenRemSet::CardTable // is supported. // Requirements of any new remembered set implementations must be added here. size_t alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable); // Parallel GC does its own alignment of the generations to avoid requiring a // large page (256M on some platforms) for the permanent generation. The // other collectors should also be updated to do their own alignment and then // this use of lcm() should be removed. if (UseLargePages && !UseParallelGC) { // in presence of large pages we have to make sure that our // alignment is large page aware alignment = lcm(os::large_page_size(), alignment); } return alignment; }
原因堆被划了一個個card page。
512個card page 便是一個Card Table。
這里假設:一個Card Page的是一個card table 的entry 與一個對應的操作系統內存頁是4KB
一個Card Table 總體堆內存最大的size便是 512個(Card Page)*4k(系統內存頁)=2MB的內存