aboutsummaryrefslogtreecommitdiff
path: root/agent
diff options
context:
space:
mode:
authorsla <none@none>2013-12-04 14:43:50 +0100
committersla <none@none>2013-12-04 14:43:50 +0100
commit9cd09eeb7afa7004a907aebbf3361ef64afc9c36 (patch)
treec41c0b906eb3600c59386187a6b05fc95cd9c66a /agent
parent9185a21065f5222f6d37f03c4c989c6ab30c6bcc (diff)
downloadjdk8u_hotspot-9cd09eeb7afa7004a907aebbf3361ef64afc9c36.tar.gz
8029395: SA: jstack throws WrongTypeException
Summary: SA missed some TLABs Reviewed-by: dsamersoff, mgerdin, brutisso
Diffstat (limited to 'agent')
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java58
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java2
2 files changed, 38 insertions, 22 deletions
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java b/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
index e663ee8e1..7c255a2e2 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
@@ -364,7 +364,7 @@ public class ObjectHeap {
}
catch (AddressException e) {
// This is okay at the top of these regions
- }
+ }
catch (UnknownOopException e) {
// This is okay at the top of these regions
}
@@ -373,7 +373,7 @@ public class ObjectHeap {
visitor.epilogue();
}
- private void addLiveRegions(List input, List output) {
+ private void addLiveRegions(String name, List input, List output) {
for (Iterator itr = input.iterator(); itr.hasNext();) {
MemRegion reg = (MemRegion) itr.next();
Address top = reg.end();
@@ -386,6 +386,9 @@ public class ObjectHeap {
}
output.add(top);
output.add(bottom);
+ if (DEBUG) {
+ System.err.println("Live region: " + name + ": " + bottom + ", " + top);
+ }
}
}
@@ -395,7 +398,7 @@ public class ObjectHeap {
}
public void doSpace(Space s) {
- addLiveRegions(s.getLiveRegions(), liveRegions);
+ addLiveRegions(s.toString(), s.getLiveRegions(), liveRegions);
}
private List liveRegions;
}
@@ -426,11 +429,11 @@ public class ObjectHeap {
ParallelScavengeHeap psh = (ParallelScavengeHeap) heap;
PSYoungGen youngGen = psh.youngGen();
// Add eden space
- addLiveRegions(youngGen.edenSpace().getLiveRegions(), liveRegions);
+ addLiveRegions("eden", youngGen.edenSpace().getLiveRegions(), liveRegions);
// Add from-space but not to-space
- addLiveRegions(youngGen.fromSpace().getLiveRegions(), liveRegions);
+ addLiveRegions("from", youngGen.fromSpace().getLiveRegions(), liveRegions);
PSOldGen oldGen = psh.oldGen();
- addLiveRegions(oldGen.objectSpace().getLiveRegions(), liveRegions);
+ addLiveRegions("old ", oldGen.objectSpace().getLiveRegions(), liveRegions);
} else if (heap instanceof G1CollectedHeap) {
G1CollectedHeap g1h = (G1CollectedHeap) heap;
g1h.heapRegionIterate(lrc);
@@ -451,23 +454,27 @@ public class ObjectHeap {
if (VM.getVM().getUseTLAB()) {
for (JavaThread thread = VM.getVM().getThreads().first(); thread != null; thread = thread.next()) {
- if (thread.isJavaThread()) {
- ThreadLocalAllocBuffer tlab = thread.tlab();
- if (tlab.start() != null) {
- if ((tlab.top() == null) || (tlab.end() == null)) {
- System.err.print("Warning: skipping invalid TLAB for thread ");
+ ThreadLocalAllocBuffer tlab = thread.tlab();
+ if (tlab.start() != null) {
+ if ((tlab.top() == null) || (tlab.end() == null)) {
+ System.err.print("Warning: skipping invalid TLAB for thread ");
+ thread.printThreadIDOn(System.err);
+ System.err.println();
+ } else {
+ if (DEBUG) {
+ System.err.print("TLAB for " + thread.getThreadName() + ", #");
thread.printThreadIDOn(System.err);
- System.err.println();
- } else {
- // Go from:
- // - below start() to start()
- // - start() to top()
- // - end() and above
- liveRegions.add(tlab.start());
- liveRegions.add(tlab.start());
- liveRegions.add(tlab.top());
- liveRegions.add(tlab.hardEnd());
+ System.err.print(": ");
+ tlab.printOn(System.err);
}
+ // Go from:
+ // - below start() to start()
+ // - start() to top()
+ // - end() and above
+ liveRegions.add(tlab.start());
+ liveRegions.add(tlab.start());
+ liveRegions.add(tlab.top());
+ liveRegions.add(tlab.hardEnd());
}
}
}
@@ -480,6 +487,15 @@ public class ObjectHeap {
Assert.that(liveRegions.size() % 2 == 0, "Must have even number of region boundaries");
}
+ if (DEBUG) {
+ System.err.println("liveRegions:");
+ for (int i = 0; i < liveRegions.size(); i += 2) {
+ Address bottom = (Address) liveRegions.get(i);
+ Address top = (Address) liveRegions.get(i+1);
+ System.err.println(" " + bottom + " - " + top);
+ }
+ }
+
return liveRegions;
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java b/agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java
index 738dc94fa..c07a0dae4 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java
@@ -109,6 +109,6 @@ public class ThreadLocalAllocBuffer extends VMObject {
public void printOn(PrintStream tty) {
tty.println(" [" + start() + "," +
- top() + "," + end() + ")");
+ top() + "," + end() + ",{" + hardEnd() + "})");
}
}