aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorswamyv <none@none>2008-08-29 14:33:05 -0700
committerswamyv <none@none>2008-08-29 14:33:05 -0700
commit4c0f5c55e0ec2e53ac1ec2f9c61a6be62ba5fbf0 (patch)
tree51a2fe1dee420dde645630fd7e03ec68a6e1f8a6
parent5a24d4dde5596c6eeb99a8d6b24e110921c4d2bc (diff)
6614052: jhat fails to read heap dump > 2GB.
Summary: Modified the jhat code to use long for unsigned int. This is a forward port of changes from Kevin Walls. Reviewed-by: jjh
-rw-r--r--src/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java b/src/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java
index df09dd5c5..1bbac940f 100644
--- a/src/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java
+++ b/src/share/classes/com/sun/tools/hat/internal/parser/HprofReader.java
@@ -120,7 +120,7 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes
private int version; // The version of .hprof being read
private int debugLevel;
- private int currPos; // Current position in the file
+ private long currPos; // Current position in the file
private int dumpsToSkip;
private boolean callStack; // If true, read the call stack of objects
@@ -196,7 +196,9 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes
break;
}
in.readInt(); // Timestamp of this record
- int length = in.readInt();
+ // Length of record: readInt() will return negative value for record
+ // length >2GB. so store 32bit value in long to keep it unsigned.
+ long length = in.readInt() & 0xffffffffL;
if (debugLevel > 0) {
System.out.println("Read record type " + type
+ ", length " + length
@@ -211,7 +213,7 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes
switch (type) {
case HPROF_UTF8: {
long id = readID();
- byte[] chars = new byte[length - identifierSize];
+ byte[] chars = new byte[(int)length - identifierSize];
in.readFully(chars);
names.put(new Long(id), new String(chars));
break;
@@ -351,8 +353,8 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes
return snapshot;
}
- private void skipBytes(int length) throws IOException {
- in.skipBytes(length);
+ private void skipBytes(long length) throws IOException {
+ in.skipBytes((int)length);
}
private int readVersionHeader() throws IOException {
@@ -381,7 +383,7 @@ public class HprofReader extends Reader /* imports */ implements ArrayTypeCodes
throw new IOException("Version string not recognized at byte " + (pos+3));
}
- private void readHeapDump(int bytesLeft, int posAtEnd) throws IOException {
+ private void readHeapDump(long bytesLeft, long posAtEnd) throws IOException {
while (bytesLeft > 0) {
int type = in.readUnsignedByte();
if (debugLevel > 0) {