RFR (S) 8014262 - more footprint info for PrintStringTableStatistics
Rickard Bäckman
rickard.backman at oracle.com
Tue May 14 22:21:05 PDT 2013
Ioi,
I think the change looks good (not a Reviewer) and would be fine with the change as is, just a few comments.
The Hashtable<T, F> *table argument in the static method Hashtable::dump() seems to be more or less a this *. Convert to a non-static?
static int literal_size(ConstantPool *cp) {Unimplemented(); return 0;} // currently
static int literal_size(Klass *k) {Unimplemented(); return 0;} // currently
should probably be removed until implemented (compile time error vs runtime error).
Thanks
/R
On May 14, 2013, at 6:37 PM, Ioi Lam wrote:
> Still looking for a reviewer. Advice on C++/template coding style below would be really appreciated!
>
> Thanks
> - Ioi
>
> On 05/09/2013 11:52 AM, Ioi Lam wrote:
>> Please review:
>>
>> http://cr.openjdk.java.net/~iklam/8014262/table_stats_001/
>>
>>
>> Bug: PrintStringTableStatistics should include more footprint info
>>
>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8014262
>> https://jbs.oracle.com/bugs/browse/JDK-8014262
>>
>>
>> Summary of fix:
>>
>> StringTable and SymbolTable take up significant footprint (about
>> 4.5% of total footprint of Eclipse). The old output doesn't has very
>> little info
>>
>> ---OLD---
>> Number of buckets : 20011
>> Average bucket size : 8
>> Variance of bucket size : 8
>> Std. dev. of bucket size: 3
>> Maximum bucket size : 25
>> StringTable statistics:
>> Number of buckets : 60013
>> Average bucket size : 0
>> Variance of bucket size : 0
>> Std. dev. of bucket size: 1
>> Maximum bucket size : 6
>>
>>
>> I modified it to print these:
>>
>> ---NEW---
>> SymbolTable statistics:
>> Number of buckets : 20011 = 160088 bytes, avg 8.00
>> Number of entries : 166724 = 4001376 bytes, avg 24.00
>> Number of literals : 166724 = 7943576 bytes, avg 47.65
>> Total footprint : = 12105040 bytes
>> Average bucket size : 8.332
>> Variance of bucket size : 8.308
>> Std. dev. of bucket size: 2.882
>> Maximum bucket size : 25
>> StringTable statistics:
>> Number of buckets : 60013 = 480104 bytes, avg 8.00
>> Number of entries : 25822 = 619728 bytes, avg 24.00
>> Number of literals : 25822 = 2458696 bytes, avg 95.22
>> Total footprint : = 3558528 bytes
>> Average bucket size : 0.430
>> Variance of bucket size : 0.435
>> Std. dev. of bucket size: 0.659
>> Maximum bucket size : 6
>>
>>
>> Templave vs virtual function:
>>
>> Part of this code is kind of ugly, in hashtable.cpp:
>>
>> ...void Hashtable<T, F>::dump( ...) {
>> ...
>> for (HashtableEntry<T, F>* e = table->bucket(i);
>> 264 e != NULL; e = e->next()) {
>> 265 count++;
>> 266 literal_bytes += literal_size(e->literal());
>> 267 }
>>
>>
>> literal_size() is magically matched by the templates to call one of these
>> in hashtable.hpp:
>>
>> template <class T, MEMFLAGS F> class Hashtable : public BasicHashtable<F> {
>> ...
>> 286 static int literal_size(Symbol *symbol);
>> 287 static int literal_size(oop oop);
>> 288 static int literal_size(ConstantPool *cp) {Unimplemented(); return 0;} // currently not used
>> 289 static int literal_size(Klass *k) {Unimplemented(); return 0;} // currently not used
>>
>>
>> I am wondering if I should change this to be a virtual function instead.
>> However, none of the current hashtable code uses virtual functions. So it
>> is considered OK to have a virtual function like this:
>>
>> template <class T, MEMFLAGS F> class Hashtable : public BasicHashtable<F> {
>> public:
>> virtual int literal_size(T) {return 0;}
>> ...
>> }
>>
>> class SymbolTable : public Hashtable<Symbol*, mtSymbol> {
>> public:
>> virtual int literal_size(Symbol* sym) {return sym->size() * HeapWordSize;}
>> ...
>> }
>>
>> Any suggestions?
>>
>> Tests:
>>
>> This code path is not taken in regular JVM executions, so
>> I just ran JPRT to make sure the code builds on all platforms.
>>
>> Tested manually on Linux and Solaris:
>> $ java -XX:+PrintStringTableStatistics -version
>>
>>
>> Thanks
>> - Ioi
>>
>
More information about the hotspot-runtime-dev
mailing list