< prev index next >

src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp

Print this page
rev 54430 : 8221836: Avoid recalculating String.hash when zero
Reviewed-by: jrose, pliden
Contributed-by: peter.levart@gmail.com, claes.redestad@oracle.com


 334   return hash;
 335 }
 336 
 337 void StringDedupTable::deduplicate(oop java_string, StringDedupStat* stat) {
 338   assert(java_lang_String::is_instance(java_string), "Must be a string");
 339   NoSafepointVerifier nsv;
 340 
 341   stat->inc_inspected();
 342 
 343   typeArrayOop value = java_lang_String::value(java_string);
 344   if (value == NULL) {
 345     // String has no value
 346     stat->inc_skipped();
 347     return;
 348   }
 349 
 350   bool latin1 = java_lang_String::is_latin1(java_string);
 351   unsigned int hash = 0;
 352 
 353   if (use_java_hash()) {
 354     // Get hash code from cache
 355     hash = java_lang_String::hash(java_string);
 356   }
 357 
 358   if (hash == 0) {
 359     // Compute hash
 360     hash = hash_code(value, latin1);
 361     stat->inc_hashed();
 362 
 363     if (use_java_hash() && hash != 0) {
 364       // Store hash code in cache
 365       java_lang_String::set_hash(java_string, hash);
 366     }
 367   }
 368 
 369   typeArrayOop existing_value = lookup_or_add(value, latin1, hash);
 370   if (oopDesc::equals_raw(existing_value, value)) {
 371     // Same value, already known
 372     stat->inc_known();
 373     return;
 374   }
 375 
 376   // Get size of value array
 377   uintx size_in_bytes = value->size() * HeapWordSize;
 378   stat->inc_new(size_in_bytes);
 379 
 380   if (existing_value != NULL) {
 381     // Existing value found, deduplicate string
 382     java_lang_String::set_value(java_string, existing_value);
 383     stat->deduped(value, size_in_bytes);
 384   }
 385 }
 386 




 334   return hash;
 335 }
 336 
 337 void StringDedupTable::deduplicate(oop java_string, StringDedupStat* stat) {
 338   assert(java_lang_String::is_instance(java_string), "Must be a string");
 339   NoSafepointVerifier nsv;
 340 
 341   stat->inc_inspected();
 342 
 343   typeArrayOop value = java_lang_String::value(java_string);
 344   if (value == NULL) {
 345     // String has no value
 346     stat->inc_skipped();
 347     return;
 348   }
 349 
 350   bool latin1 = java_lang_String::is_latin1(java_string);
 351   unsigned int hash = 0;
 352 
 353   if (use_java_hash()) {
 354     if (!java_lang_String::hash_is_set(java_string)) {
 355       stat->inc_hashed();
 356     }
 357     hash = java_lang_String::hash_code(java_string);
 358   } else {
 359     // Compute hash
 360     hash = hash_code(value, latin1);
 361     stat->inc_hashed();





 362   }
 363 
 364   typeArrayOop existing_value = lookup_or_add(value, latin1, hash);
 365   if (oopDesc::equals_raw(existing_value, value)) {
 366     // Same value, already known
 367     stat->inc_known();
 368     return;
 369   }
 370 
 371   // Get size of value array
 372   uintx size_in_bytes = value->size() * HeapWordSize;
 373   stat->inc_new(size_in_bytes);
 374 
 375   if (existing_value != NULL) {
 376     // Existing value found, deduplicate string
 377     java_lang_String::set_value(java_string, existing_value);
 378     stat->deduped(value, size_in_bytes);
 379   }
 380 }
 381 


< prev index next >