mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 09:34:38 +02:00
8267185
: Add string deduplication support to ParallelGC
Reviewed-by: kbarrett, ayang
This commit is contained in:
parent
d874e9616f
commit
fb1dfc6f49
17 changed files with 182 additions and 1 deletions
|
@ -41,6 +41,7 @@
|
||||||
#include "gc/shared/gcInitLogger.hpp"
|
#include "gc/shared/gcInitLogger.hpp"
|
||||||
#include "gc/shared/locationPrinter.inline.hpp"
|
#include "gc/shared/locationPrinter.inline.hpp"
|
||||||
#include "gc/shared/scavengableNMethods.hpp"
|
#include "gc/shared/scavengableNMethods.hpp"
|
||||||
|
#include "gc/shared/suspendibleThreadSet.hpp"
|
||||||
#include "logging/log.hpp"
|
#include "logging/log.hpp"
|
||||||
#include "memory/iterator.hpp"
|
#include "memory/iterator.hpp"
|
||||||
#include "memory/metaspaceCounters.hpp"
|
#include "memory/metaspaceCounters.hpp"
|
||||||
|
@ -162,6 +163,17 @@ void ParallelScavengeHeap::initialize_serviceability() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParallelScavengeHeap::safepoint_synchronize_begin() {
|
||||||
|
if (UseStringDeduplication) {
|
||||||
|
SuspendibleThreadSet::synchronize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParallelScavengeHeap::safepoint_synchronize_end() {
|
||||||
|
if (UseStringDeduplication) {
|
||||||
|
SuspendibleThreadSet::desynchronize();
|
||||||
|
}
|
||||||
|
}
|
||||||
class PSIsScavengable : public BoolObjectClosure {
|
class PSIsScavengable : public BoolObjectClosure {
|
||||||
bool do_object_b(oop obj) {
|
bool do_object_b(oop obj) {
|
||||||
return ParallelScavengeHeap::heap()->is_in_young(obj);
|
return ParallelScavengeHeap::heap()->is_in_young(obj);
|
||||||
|
|
|
@ -139,6 +139,9 @@ class ParallelScavengeHeap : public CollectedHeap {
|
||||||
// Returns JNI_OK on success
|
// Returns JNI_OK on success
|
||||||
virtual jint initialize();
|
virtual jint initialize();
|
||||||
|
|
||||||
|
virtual void safepoint_synchronize_begin();
|
||||||
|
virtual void safepoint_synchronize_end();
|
||||||
|
|
||||||
void post_initialize();
|
void post_initialize();
|
||||||
void update_counters();
|
void update_counters();
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,12 @@ void ParCompactionManager::reset_all_bitmap_query_caches() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParCompactionManager::flush_all_string_dedup_requests() {
|
||||||
|
uint parallel_gc_threads = ParallelScavengeHeap::heap()->workers().total_workers();
|
||||||
|
for (uint i=0; i<=parallel_gc_threads; i++) {
|
||||||
|
_manager_array[i]->flush_string_dedup_requests();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ParCompactionManager*
|
ParCompactionManager*
|
||||||
ParCompactionManager::gc_thread_compaction_manager(uint index) {
|
ParCompactionManager::gc_thread_compaction_manager(uint index) {
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define SHARE_GC_PARALLEL_PSCOMPACTIONMANAGER_HPP
|
#define SHARE_GC_PARALLEL_PSCOMPACTIONMANAGER_HPP
|
||||||
|
|
||||||
#include "gc/parallel/psParallelCompact.hpp"
|
#include "gc/parallel/psParallelCompact.hpp"
|
||||||
|
#include "gc/shared/stringdedup/stringDedup.hpp"
|
||||||
#include "gc/shared/taskqueue.hpp"
|
#include "gc/shared/taskqueue.hpp"
|
||||||
#include "gc/shared/taskTerminator.hpp"
|
#include "gc/shared/taskTerminator.hpp"
|
||||||
#include "memory/allocation.hpp"
|
#include "memory/allocation.hpp"
|
||||||
|
@ -88,6 +89,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
|
||||||
oop _last_query_obj;
|
oop _last_query_obj;
|
||||||
size_t _last_query_ret;
|
size_t _last_query_ret;
|
||||||
|
|
||||||
|
StringDedup::Requests _string_dedup_requests;
|
||||||
|
|
||||||
static PSOldGen* old_gen() { return _old_gen; }
|
static PSOldGen* old_gen() { return _old_gen; }
|
||||||
static ObjectStartArray* start_array() { return _start_array; }
|
static ObjectStartArray* start_array() { return _start_array; }
|
||||||
static OopTaskQueueSet* oop_task_queues() { return _oop_task_queues; }
|
static OopTaskQueueSet* oop_task_queues() { return _oop_task_queues; }
|
||||||
|
@ -125,6 +128,10 @@ class ParCompactionManager : public CHeapObj<mtGC> {
|
||||||
_last_query_ret = 0;
|
_last_query_ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush_string_dedup_requests() {
|
||||||
|
_string_dedup_requests.flush();
|
||||||
|
}
|
||||||
|
|
||||||
// Bitmap query support, cache last query and result
|
// Bitmap query support, cache last query and result
|
||||||
HeapWord* last_query_begin() { return _last_query_beg; }
|
HeapWord* last_query_begin() { return _last_query_beg; }
|
||||||
oop last_query_object() { return _last_query_obj; }
|
oop last_query_object() { return _last_query_obj; }
|
||||||
|
@ -136,6 +143,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
|
||||||
|
|
||||||
static void reset_all_bitmap_query_caches();
|
static void reset_all_bitmap_query_caches();
|
||||||
|
|
||||||
|
static void flush_all_string_dedup_requests();
|
||||||
|
|
||||||
RegionTaskQueue* region_stack() { return &_region_stack; }
|
RegionTaskQueue* region_stack() { return &_region_stack; }
|
||||||
|
|
||||||
static ParCompactionManager* get_vmthread_cm() { return _manager_array[ParallelGCThreads]; }
|
static ParCompactionManager* get_vmthread_cm() { return _manager_array[ParallelGCThreads]; }
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "classfile/javaClasses.inline.hpp"
|
#include "classfile/javaClasses.inline.hpp"
|
||||||
#include "gc/parallel/parMarkBitMap.hpp"
|
#include "gc/parallel/parMarkBitMap.hpp"
|
||||||
#include "gc/parallel/psParallelCompact.inline.hpp"
|
#include "gc/parallel/psParallelCompact.inline.hpp"
|
||||||
|
#include "gc/parallel/psStringDedup.hpp"
|
||||||
#include "gc/shared/taskqueue.inline.hpp"
|
#include "gc/shared/taskqueue.inline.hpp"
|
||||||
#include "oops/access.inline.hpp"
|
#include "oops/access.inline.hpp"
|
||||||
#include "oops/arrayOop.hpp"
|
#include "oops/arrayOop.hpp"
|
||||||
|
@ -108,6 +109,12 @@ inline void ParCompactionManager::mark_and_push(T* p) {
|
||||||
|
|
||||||
if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
|
if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
|
||||||
push(obj);
|
push(obj);
|
||||||
|
|
||||||
|
if (StringDedup::is_enabled() &&
|
||||||
|
java_lang_String::is_instance_inlined(obj) &&
|
||||||
|
psStringDedup::is_candidate_from_mark(obj)) {
|
||||||
|
_string_dedup_requests.add(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "gc/parallel/psPromotionManager.inline.hpp"
|
#include "gc/parallel/psPromotionManager.inline.hpp"
|
||||||
#include "gc/parallel/psRootType.hpp"
|
#include "gc/parallel/psRootType.hpp"
|
||||||
#include "gc/parallel/psScavenge.hpp"
|
#include "gc/parallel/psScavenge.hpp"
|
||||||
|
#include "gc/parallel/psStringDedup.hpp"
|
||||||
#include "gc/parallel/psYoungGen.hpp"
|
#include "gc/parallel/psYoungGen.hpp"
|
||||||
#include "gc/shared/gcCause.hpp"
|
#include "gc/shared/gcCause.hpp"
|
||||||
#include "gc/shared/gcHeapSummary.hpp"
|
#include "gc/shared/gcHeapSummary.hpp"
|
||||||
|
@ -1021,6 +1022,8 @@ void PSParallelCompact::post_compact()
|
||||||
_space_info[id].publish_new_top();
|
_space_info[id].publish_new_top();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ParCompactionManager::flush_all_string_dedup_requests();
|
||||||
|
|
||||||
MutableSpace* const eden_space = _space_info[eden_space_id].space();
|
MutableSpace* const eden_space = _space_info[eden_space_id].space();
|
||||||
MutableSpace* const from_space = _space_info[from_space_id].space();
|
MutableSpace* const from_space = _space_info[from_space_id].space();
|
||||||
MutableSpace* const to_space = _space_info[to_space_id].space();
|
MutableSpace* const to_space = _space_info[to_space_id].space();
|
||||||
|
|
|
@ -121,6 +121,7 @@ bool PSPromotionManager::post_scavenge(YoungGCTracer& gc_tracer) {
|
||||||
promotion_failure_occurred = true;
|
promotion_failure_occurred = true;
|
||||||
}
|
}
|
||||||
manager->flush_labs();
|
manager->flush_labs();
|
||||||
|
manager->flush_string_dedup_requests();
|
||||||
}
|
}
|
||||||
if (!promotion_failure_occurred) {
|
if (!promotion_failure_occurred) {
|
||||||
// If there was no promotion failure, the preserved mark stacks
|
// If there was no promotion failure, the preserved mark stacks
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "gc/shared/copyFailedInfo.hpp"
|
#include "gc/shared/copyFailedInfo.hpp"
|
||||||
#include "gc/shared/gcTrace.hpp"
|
#include "gc/shared/gcTrace.hpp"
|
||||||
#include "gc/shared/preservedMarks.hpp"
|
#include "gc/shared/preservedMarks.hpp"
|
||||||
|
#include "gc/shared/stringdedup/stringDedup.hpp"
|
||||||
#include "gc/shared/taskqueue.hpp"
|
#include "gc/shared/taskqueue.hpp"
|
||||||
#include "memory/padded.hpp"
|
#include "memory/padded.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
|
@ -91,6 +92,8 @@ class PSPromotionManager {
|
||||||
PreservedMarks* _preserved_marks;
|
PreservedMarks* _preserved_marks;
|
||||||
PromotionFailedInfo _promotion_failed_info;
|
PromotionFailedInfo _promotion_failed_info;
|
||||||
|
|
||||||
|
StringDedup::Requests _string_dedup_requests;
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
static PSOldGen* old_gen() { return _old_gen; }
|
static PSOldGen* old_gen() { return _old_gen; }
|
||||||
static MutableSpace* young_space() { return _young_space; }
|
static MutableSpace* young_space() { return _young_space; }
|
||||||
|
@ -145,6 +148,8 @@ class PSPromotionManager {
|
||||||
static void restore_preserved_marks();
|
static void restore_preserved_marks();
|
||||||
|
|
||||||
void flush_labs();
|
void flush_labs();
|
||||||
|
void flush_string_dedup_requests() { _string_dedup_requests.flush(); }
|
||||||
|
|
||||||
void drain_stacks(bool totally_drain) {
|
void drain_stacks(bool totally_drain) {
|
||||||
drain_stacks_depth(totally_drain);
|
drain_stacks_depth(totally_drain);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "gc/parallel/psOldGen.hpp"
|
#include "gc/parallel/psOldGen.hpp"
|
||||||
#include "gc/parallel/psPromotionLAB.inline.hpp"
|
#include "gc/parallel/psPromotionLAB.inline.hpp"
|
||||||
#include "gc/parallel/psScavenge.inline.hpp"
|
#include "gc/parallel/psScavenge.inline.hpp"
|
||||||
|
#include "gc/parallel/psStringDedup.hpp"
|
||||||
#include "gc/shared/taskqueue.inline.hpp"
|
#include "gc/shared/taskqueue.inline.hpp"
|
||||||
#include "gc/shared/tlab_globals.hpp"
|
#include "gc/shared/tlab_globals.hpp"
|
||||||
#include "logging/log.hpp"
|
#include "logging/log.hpp"
|
||||||
|
@ -284,6 +285,12 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o,
|
||||||
} else {
|
} else {
|
||||||
// we'll just push its contents
|
// we'll just push its contents
|
||||||
push_contents(new_obj);
|
push_contents(new_obj);
|
||||||
|
|
||||||
|
if (StringDedup::is_enabled() &&
|
||||||
|
java_lang_String::is_instance_inlined(new_obj) &&
|
||||||
|
psStringDedup::is_candidate_from_evacuation(new_obj, new_obj_is_tenured)) {
|
||||||
|
_string_dedup_requests.add(o);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new_obj;
|
return new_obj;
|
||||||
} else {
|
} else {
|
||||||
|
|
50
src/hotspot/share/gc/parallel/psStringDedup.hpp
Normal file
50
src/hotspot/share/gc/parallel/psStringDedup.hpp
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
|
||||||
|
#define SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
|
||||||
|
|
||||||
|
#include "gc/parallel/psScavenge.hpp"
|
||||||
|
#include "gc/shared/stringdedup/stringDedup.hpp"
|
||||||
|
#include "memory/allStatic.hpp"
|
||||||
|
#include "oops/oopsHierarchy.hpp"
|
||||||
|
|
||||||
|
class psStringDedup : AllStatic {
|
||||||
|
public:
|
||||||
|
static bool is_candidate_from_mark(oop java_string) {
|
||||||
|
// Candidate if string is being evacuated from young to old but has not
|
||||||
|
// reached the deduplication age threshold, i.e. has not previously been a
|
||||||
|
// candidate during its life in the young generation.
|
||||||
|
return PSScavenge::is_obj_in_young(java_string) &&
|
||||||
|
StringDedup::is_below_threshold_age(java_string->age());
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_candidate_from_evacuation(oop obj,
|
||||||
|
bool obj_is_tenured) {
|
||||||
|
return obj_is_tenured ?
|
||||||
|
StringDedup::is_below_threshold_age(obj->age()) :
|
||||||
|
StringDedup::is_threshold_age(obj->age());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif // SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
|
|
@ -116,7 +116,7 @@ size_t StringDedup::Config::desired_table_size(size_t entry_count) {
|
||||||
bool StringDedup::Config::ergo_initialize() {
|
bool StringDedup::Config::ergo_initialize() {
|
||||||
if (!UseStringDeduplication) {
|
if (!UseStringDeduplication) {
|
||||||
return true;
|
return true;
|
||||||
} else if (!UseG1GC && !UseShenandoahGC && !UseZGC) {
|
} else if (!UseG1GC && !UseShenandoahGC && !UseZGC && !UseParallelGC) {
|
||||||
// String deduplication requested but not supported by the selected GC.
|
// String deduplication requested but not supported by the selected GC.
|
||||||
// Warn and force disable, but don't error except in debug build with
|
// Warn and force disable, but don't error except in debug build with
|
||||||
// incorrect default.
|
// incorrect default.
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationAgeThreshold G1
|
* @run driver gc.stringdedup.TestStringDeduplicationAgeThreshold G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationAgeThreshold
|
||||||
|
* @summary Test string deduplication age threshold
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationAgeThreshold Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationAgeThreshold
|
* @test TestStringDeduplicationAgeThreshold
|
||||||
* @summary Test string deduplication age threshold
|
* @summary Test string deduplication age threshold
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationFullGC G1
|
* @run driver gc.stringdedup.TestStringDeduplicationFullGC G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationFullGC
|
||||||
|
* @summary Test string deduplication during full GC
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationFullGC Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationFullGC
|
* @test TestStringDeduplicationFullGC
|
||||||
* @summary Test string deduplication during full GC
|
* @summary Test string deduplication during full GC
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationInterned G1
|
* @run driver gc.stringdedup.TestStringDeduplicationInterned G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationInterned
|
||||||
|
* @summary Test string deduplication of interned strings
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationInterned Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationInterned
|
* @test TestStringDeduplicationInterned
|
||||||
* @summary Test string deduplication of interned strings
|
* @summary Test string deduplication of interned strings
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationPrintOptions G1
|
* @run driver gc.stringdedup.TestStringDeduplicationPrintOptions G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationPrintOptions
|
||||||
|
* @summary Test string deduplication print options
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationPrintOptions Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationPrintOptions
|
* @test TestStringDeduplicationPrintOptions
|
||||||
* @summary Test string deduplication print options
|
* @summary Test string deduplication print options
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationTableResize G1
|
* @run driver gc.stringdedup.TestStringDeduplicationTableResize G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationTableResize
|
||||||
|
* @summary Test string deduplication table resize
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationTableResize Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationTableResize
|
* @test TestStringDeduplicationTableResize
|
||||||
* @summary Test string deduplication table resize
|
* @summary Test string deduplication table resize
|
||||||
|
|
|
@ -36,6 +36,19 @@ package gc.stringdedup;
|
||||||
* @run driver gc.stringdedup.TestStringDeduplicationYoungGC G1
|
* @run driver gc.stringdedup.TestStringDeduplicationYoungGC G1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test TestStringDeduplicationYoungGC
|
||||||
|
* @summary Test string deduplication during young GC
|
||||||
|
* @bug 8029075
|
||||||
|
* @requires vm.gc.Parallel
|
||||||
|
* @library /test/lib
|
||||||
|
* @library /
|
||||||
|
* @modules java.base/jdk.internal.misc:open
|
||||||
|
* @modules java.base/java.lang:open
|
||||||
|
* java.management
|
||||||
|
* @run driver gc.stringdedup.TestStringDeduplicationYoungGC Parallel
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @test TestStringDeduplicationYoungGC
|
* @test TestStringDeduplicationYoungGC
|
||||||
* @summary Test string deduplication during young GC
|
* @summary Test string deduplication during young GC
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue