Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2124282 | 5.0u4 | Karen Kinnear | P2 | Closed | Fixed | b03 |
JDK-2124049 | 1.4.2_09 | Chris Phillips | P3 | Closed | Fixed | b01 |
Permspace can get corrupted on Solaris Sparc 7,8,9 if it is positioned at
0x80000000. This is reproducible even with one of the demo programs:
| 1. get hold of a complete J2SE 1.4.2_07 (for example) SDK installation.
| One of mine happens to live at /opt_earth/java/j2sdk1.4.2_07/. Adapt
| path names below suitably.-- Make sure DISPLAY is set, but this is
| just so the JVM has something nice to do.
|
| 2. cd /opt_earth/java/j2sdk1.4.2_07
| bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1440m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| (from another terminal window) locate the pid of this java process,
| and
| pmap $pid
|
| 3. Inspect the pmap output. Find the segment or two which make up the
| java heap. The permanent generation segment will be the next one
| above these in the address space, i.e. the next one below these in
| pmap output. For example, this might look like:
| ...
| 6F380000 8K read/write/exec [ anon ]
| 6F400000 34112K read/write/exec [ anon ] <<<<java heap
| 74950000 273088K read/write/exec [ anon ] <<<<java heap
| 9F400000 6912K read/write/exec [ anon ] <<<<perm gen
| F9580000 8K read/write/exec [ anon ]
| Note that the segments are spaced such that there's room to grow the
| heap to 768m, and room to grow the perm gen to 1440m, and additional
| red zone padding between segments.
| Note also that these segments are created from higher towards lower
| addresses. The 0x9F400000 was chosen by the kernel to accommodate
| a 1440m segment plus redzone padding, given that another segment
| already started at 0xF9580000. Thus the requested MaxPermSize
| determines where the perm gen segment will start (the stuff at
| higher addresses will not vary much from one run to the next; but
| it will depend on the exact sizes of several shared libraries, and
| thus will vary depending on Solaris version and patch levels.)
|
| 4. Work out how much larger MaxPermSize will need to be in order to
| get the base address of the perm gen segment just below 0x80000000,
| but the already-occupied part of it extends above . This
| may take a few trial and error iterations, since small changes are
| sometimes absorbed by the padding. For example:
| bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1940m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| ...
| 4FF7C000 96K read/write/exec /usr/dt/lib/libXm.so.4
| 50000000 34112K read/write/exec [ anon ]
| 55550000 273088K read/write/exec [ anon ]
| 80000000 6400K read/write/exec [ anon ]
| F9500000 352K read/exec /opt_earth/java/j2sdk1.4.2_07/jre/lib/sparc/libawt.so
| ...
| and I got the same at 1942m, but the next 2-MBy increment did the
| trick on my system:
|
| 5. bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1944m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| Exception in thread "main" java.lang.NoSuchMethodError: sun.awt.image.InputStreamImageSource: method <init>()V not found
| at sun.awt.image.URLImageSource.<init>(URLImageSource.java:23)
| at sun.awt.SunToolkit.createImage(SunToolkit.java:529)
| at java2d.DemoImages.getImage(DemoImages.java:87)
| at java2d.DemoImages.<init>(DemoImages.java:72)
| at java2d.Java2Demo.<init>(Java2Demo.java:113)
| at java2d.Java2Demo.main(Java2Demo.java:478)
|
| This is le bug.
|
| The progress-bar graphics in the preliminary window will have frozen
| up showing "Loading image" (for example - the victim class would
| depend on where exactly each class falls in the perm gen segment
| which now straddles the 0x80000000 line), and the java process is
| sitting there doing nothing, ready to debug with everything you can
| think of throwing at it - SIGQUIT, pmap, gcore, dbx, SA...
| In my case, the address space layout around the perm gen segment was
| now:
| 4FB7C000 96K read/write/exec /usr/dt/lib/libXm.so.4
| 4FC00000 34112K read/write/exec [ anon ]
| 55150000 273088K read/write/exec [ anon ]
| 7FC00000 4352K read/write/exec [ anon ]
| F9500000 352K read/exec /opt_earth/java/j2sdk1.4.2_07/jre/lib/sparc/libawt.so
| so of those 4352K's worth of page table mappings already created in
| the perm gen, there are 4096k in 0x7FC00000-7FFFFFFF and 256k above
| 0x80000000.
|
| 6. It seems that similar problems can also happen when the perm gen is
| above 0x80000000 but the java heap crosses the 0x80000000 mark, or
| even when the java heap is strictly below and the perm gen is strictly
| above this (and some copying of stuff from the heap to the perm gen
| occurs), but this is not as easy to reproduce with a small demo such
| as the Java2D one - you'd need to run something which loads far more
+ classes and exercises garbage collection seriously.
2.4 Describe problem impact to the customer. (optional)
###@###.### 2005-2-25 14:28:42 GMT
0x80000000. This is reproducible even with one of the demo programs:
| 1. get hold of a complete J2SE 1.4.2_07 (for example) SDK installation.
| One of mine happens to live at /opt_earth/java/j2sdk1.4.2_07/. Adapt
| path names below suitably.-- Make sure DISPLAY is set, but this is
| just so the JVM has something nice to do.
|
| 2. cd /opt_earth/java/j2sdk1.4.2_07
| bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1440m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| (from another terminal window) locate the pid of this java process,
| and
| pmap $pid
|
| 3. Inspect the pmap output. Find the segment or two which make up the
| java heap. The permanent generation segment will be the next one
| above these in the address space, i.e. the next one below these in
| pmap output. For example, this might look like:
| ...
| 6F380000 8K read/write/exec [ anon ]
| 6F400000 34112K read/write/exec [ anon ] <<<<java heap
| 74950000 273088K read/write/exec [ anon ] <<<<java heap
| 9F400000 6912K read/write/exec [ anon ] <<<<perm gen
| F9580000 8K read/write/exec [ anon ]
| Note that the segments are spaced such that there's room to grow the
| heap to 768m, and room to grow the perm gen to 1440m, and additional
| red zone padding between segments.
| Note also that these segments are created from higher towards lower
| addresses. The 0x9F400000 was chosen by the kernel to accommodate
| a 1440m segment plus redzone padding, given that another segment
| already started at 0xF9580000. Thus the requested MaxPermSize
| determines where the perm gen segment will start (the stuff at
| higher addresses will not vary much from one run to the next; but
| it will depend on the exact sizes of several shared libraries, and
| thus will vary depending on Solaris version and patch levels.)
|
| 4. Work out how much larger MaxPermSize will need to be in order to
| get the base address of the perm gen segment just below 0x80000000,
| but the already-occupied part of it extends above . This
| may take a few trial and error iterations, since small changes are
| sometimes absorbed by the padding. For example:
| bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1940m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| ...
| 4FF7C000 96K read/write/exec /usr/dt/lib/libXm.so.4
| 50000000 34112K read/write/exec [ anon ]
| 55550000 273088K read/write/exec [ anon ]
| 80000000 6400K read/write/exec [ anon ]
| F9500000 352K read/exec /opt_earth/java/j2sdk1.4.2_07/jre/lib/sparc/libawt.so
| ...
| and I got the same at 1942m, but the next 2-MBy increment did the
| trick on my system:
|
| 5. bin/java -Xms300m -Xmx768m -XX:MaxPermSize=1944m \
| -jar demo/jfc/Java2D/Java2Demo.jar
| Exception in thread "main" java.lang.NoSuchMethodError: sun.awt.image.InputStreamImageSource: method <init>()V not found
| at sun.awt.image.URLImageSource.<init>(URLImageSource.java:23)
| at sun.awt.SunToolkit.createImage(SunToolkit.java:529)
| at java2d.DemoImages.getImage(DemoImages.java:87)
| at java2d.DemoImages.<init>(DemoImages.java:72)
| at java2d.Java2Demo.<init>(Java2Demo.java:113)
| at java2d.Java2Demo.main(Java2Demo.java:478)
|
| This is le bug.
|
| The progress-bar graphics in the preliminary window will have frozen
| up showing "Loading image" (for example - the victim class would
| depend on where exactly each class falls in the perm gen segment
| which now straddles the 0x80000000 line), and the java process is
| sitting there doing nothing, ready to debug with everything you can
| think of throwing at it - SIGQUIT, pmap, gcore, dbx, SA...
| In my case, the address space layout around the perm gen segment was
| now:
| 4FB7C000 96K read/write/exec /usr/dt/lib/libXm.so.4
| 4FC00000 34112K read/write/exec [ anon ]
| 55150000 273088K read/write/exec [ anon ]
| 7FC00000 4352K read/write/exec [ anon ]
| F9500000 352K read/exec /opt_earth/java/j2sdk1.4.2_07/jre/lib/sparc/libawt.so
| so of those 4352K's worth of page table mappings already created in
| the perm gen, there are 4096k in 0x7FC00000-7FFFFFFF and 256k above
| 0x80000000.
|
| 6. It seems that similar problems can also happen when the perm gen is
| above 0x80000000 but the java heap crosses the 0x80000000 mark, or
| even when the java heap is strictly below and the perm gen is strictly
| above this (and some copying of stuff from the heap to the perm gen
| occurs), but this is not as easy to reproduce with a small demo such
| as the Java2D one - you'd need to run something which loads far more
+ classes and exercises garbage collection seriously.
2.4 Describe problem impact to the customer. (optional)
###@###.### 2005-2-25 14:28:42 GMT
- backported by
-
JDK-2124282 Permspace can become corrupted if positioned at 0x80000000
-
- Closed
-
-
JDK-2124049 Permspace can become corrupted if positioned at 0x80000000
-
- Closed
-