JDK-7014874 : Incorrect COOPs modes on solaris-{sparcv9,amd64} with ParallelGC
  • Type: Bug
  • Component: hotspot
  • Sub-Component: gc
  • Affected Version: hs20
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2011-01-26
  • Updated: 2011-03-08
  • Resolved: 2011-03-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7 Other
7Fixed hs21Fixed
Description
The following heap parameters cause "zero based Compressed Oops" to be used, while "zero based Compressed Oops, 32-bits Oops" are expected. The parameters are "near maximum" for "zero based Compressed Oops, 32-bi
ts Oops" mode, i.e. HeapBaseMinAddress + Xmx + MaxPermSize = 4g:

1.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=8 -XX:HeapBaseMinAddress=2048m -Xmx1024m -XX:MaxPermSize=1024m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOop
sMode -version

heap address: 0x0000000080000000, size: 2050 MB, zero based Compressed Oops

2.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=8 -XX:HeapBaseMinAddress=1536m -Xmx2048m -XX:MaxPermSize=512m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

heap address: 0x0000000060000000, size: 2562 MB, zero based Compressed Oops

3.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=16 -XX:HeapBaseMinAddress=2048m -Xmx1024m -XX:MaxPermSize=1024m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

heap address: 0x0000000080000000, size: 2050 MB, zero based Compressed Oops

4.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=16 -XX:HeapBaseMinAddress=1536m -Xmx2048m -XX:MaxPermSize=512m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

heap address: 0x0000000060000000, size: 2562 MB, zero based Compressed Oops



The following heap parameters cause "Compressed Oops with base" to be used, while "zero based Compressed Oops" are expected. The parameters are "near maximum" for "Compressed Oops with base", i.e. HeapBaseMinAddress + Xmx + MaxPermSize = 32g (64g if -XX:ObjectAlignmentInBytes=16):

5.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=8 -XX:HeapBaseMinAddress=16384m -Xmx8192m -XX:MaxPermSize=8192m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

Protected page at the reserved heap base: 0x00000003ffe00000 / 2097152 bytes

heap address: 0x0000000400000000, size: 16386 MB, Compressed Oops with base: 0x00000003fffff000

6.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=8 -XX:HeapBaseMinAddress=16128m -Xmx8320m -XX:MaxPermSize=8320m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

Protected page at the reserved heap base: 0x00000003efe00000 / 2097152 bytes

heap address: 0x00000003f0000000, size: 16642 MB, Compressed Oops with base: 0x00000003effff000

7.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=16 -XX:HeapBaseMinAddress=65400m -Xmx112m -XX:MaxPermSize=24m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

Protected page at the reserved heap base: 0x0000000ff77f0000 / 65536 bytes

heap address: 0x0000000ff7800000, size: 138 MB, Compressed Oops with base: 0x0000000ff77ff000

8.
.../solaris-amd64//bin/java -d64 -server -Xmixed -XX:+UseParallelGC -XX:ObjectAlignmentInBytes=16 -XX:HeapBaseMinAddress=32762m -Xmx16390m -XX:MaxPermSize=16384m -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

Protected page at the reserved heap base: 0x00000007ff800000 / 2097152 bytes

heap address: 0x00000007ffa00000, size: 32776 MB, Compressed Oops with base: 0x00000007ff9ff000



All instances are common to solaris-sparcv9 and solaris-amd64, UseParallelGC and UseParallelOldGC

Comments
PUBLIC COMMENTS scale_by_NewRatio_aligned() aligns boundary between old and young gens to min_alignment() (64K). But code in ParallelScavengeHeap::initialize() aligns up both old and young gen sizes to large page size. As result total heap size could be increased by one large page and cross 4gb boundary preventing usage of 32-bit COOPs. Align old gen size down to keep specified heap size but not less than its old gen min size.
09-02-2011

EVALUATION http://hg.openjdk.java.net/jdk7/hotspot-comp/hotspot/rev/336d17dff7cc
09-02-2011