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
|