提交 4a396a58 编写于 作者: N never

7108242: jinfo -permstat shouldn't report interned strings as part of perm

Reviewed-by: kvn, twisti
上级 4a3d8765
...@@ -30,6 +30,7 @@ import sun.jvm.hotspot.gc_implementation.g1.*; ...@@ -30,6 +30,7 @@ import sun.jvm.hotspot.gc_implementation.g1.*;
import sun.jvm.hotspot.gc_implementation.parallelScavenge.*; import sun.jvm.hotspot.gc_implementation.parallelScavenge.*;
import sun.jvm.hotspot.gc_implementation.shared.*; import sun.jvm.hotspot.gc_implementation.shared.*;
import sun.jvm.hotspot.memory.*; import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.runtime.*;
public class HeapSummary extends Tool { public class HeapSummary extends Tool {
...@@ -134,6 +135,9 @@ public class HeapSummary extends Tool { ...@@ -134,6 +135,9 @@ public class HeapSummary extends Tool {
} else { } else {
throw new RuntimeException("unknown CollectedHeap type : " + heap.getClass()); throw new RuntimeException("unknown CollectedHeap type : " + heap.getClass());
} }
System.out.println();
printInternStringStatistics();
} }
// Helper methods // Helper methods
...@@ -248,4 +252,41 @@ public class HeapSummary extends Tool { ...@@ -248,4 +252,41 @@ public class HeapSummary extends Tool {
return -1; return -1;
} }
} }
private void printInternStringStatistics() {
class StringStat implements StringTable.StringVisitor {
private int count;
private long size;
private OopField stringValueField;
StringStat() {
VM vm = VM.getVM();
SystemDictionary sysDict = vm.getSystemDictionary();
InstanceKlass strKlass = sysDict.getStringKlass();
// String has a field named 'value' of type 'char[]'.
stringValueField = (OopField) strKlass.findField("value", "[C");
}
private long stringSize(Instance instance) {
// We include String content in size calculation.
return instance.getObjectSize() +
stringValueField.getValue(instance).getObjectSize();
}
public void visit(Instance str) {
count++;
size += stringSize(str);
}
public void print() {
System.out.println(count +
" interned Strings occupying " + size + " bytes.");
}
}
StringStat stat = new StringStat();
StringTable strTable = VM.getVM().getStringTable();
strTable.stringsDo(stat);
stat.print();
}
} }
...@@ -63,47 +63,9 @@ public class PermStat extends Tool { ...@@ -63,47 +63,9 @@ public class PermStat extends Tool {
} }
public void run() { public void run() {
printInternStringStatistics();
printClassLoaderStatistics(); printClassLoaderStatistics();
} }
private void printInternStringStatistics() {
class StringStat implements StringTable.StringVisitor {
private int count;
private long size;
private OopField stringValueField;
StringStat() {
VM vm = VM.getVM();
SystemDictionary sysDict = vm.getSystemDictionary();
InstanceKlass strKlass = sysDict.getStringKlass();
// String has a field named 'value' of type 'char[]'.
stringValueField = (OopField) strKlass.findField("value", "[C");
}
private long stringSize(Instance instance) {
// We include String content in size calculation.
return instance.getObjectSize() +
stringValueField.getValue(instance).getObjectSize();
}
public void visit(Instance str) {
count++;
size += stringSize(str);
}
public void print() {
System.out.println(count +
" intern Strings occupying " + size + " bytes.");
}
}
StringStat stat = new StringStat();
StringTable strTable = VM.getVM().getStringTable();
strTable.stringsDo(stat);
stat.print();
}
private void printClassLoaderStatistics() { private void printClassLoaderStatistics() {
final PrintStream out = System.out; final PrintStream out = System.out;
final PrintStream err = System.err; final PrintStream err = System.err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册