mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-02 20:20:14 +00:00
Merge
This commit is contained in:
commit
bfd05658c9
@ -37,6 +37,7 @@ import jdk.tools.jaotc.binformat.Symbol.Binding;
|
||||
import jdk.tools.jaotc.binformat.Symbol.Kind;
|
||||
import jdk.tools.jaotc.binformat.elf.JELFRelocObject;
|
||||
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
|
||||
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
|
||||
|
||||
/**
|
||||
* A format-agnostic container class that holds various components of a binary.
|
||||
@ -257,9 +258,9 @@ public class BinaryContainer implements SymbolTable {
|
||||
* prefix {@code prefix}. It also initializes internal code container, symbol table and
|
||||
* relocation tables.
|
||||
*/
|
||||
public BinaryContainer(GraalHotSpotVMConfig config, String jvmVersion) {
|
||||
this.codeSegmentSize = config.codeSegmentSize;
|
||||
this.codeEntryAlignment = config.codeEntryAlignment;
|
||||
public BinaryContainer(GraalHotSpotVMConfig graalHotSpotVMConfig, GraphBuilderConfiguration graphBuilderConfig, String jvmVersion) {
|
||||
this.codeSegmentSize = graalHotSpotVMConfig.codeSegmentSize;
|
||||
this.codeEntryAlignment = graalHotSpotVMConfig.codeEntryAlignment;
|
||||
|
||||
// read only, code
|
||||
codeContainer = new CodeContainer(".text", this);
|
||||
@ -289,30 +290,31 @@ public class BinaryContainer implements SymbolTable {
|
||||
|
||||
addGlobalSymbols();
|
||||
|
||||
recordConfiguration(config);
|
||||
recordConfiguration(graalHotSpotVMConfig, graphBuilderConfig);
|
||||
}
|
||||
|
||||
private void recordConfiguration(GraalHotSpotVMConfig config) {
|
||||
private void recordConfiguration(GraalHotSpotVMConfig graalHotSpotVMConfig, GraphBuilderConfiguration graphBuilderConfig) {
|
||||
// @formatter:off
|
||||
boolean[] booleanFlags = { config.cAssertions, // Debug VM
|
||||
config.useCompressedOops,
|
||||
config.useCompressedClassPointers,
|
||||
config.compactFields,
|
||||
config.useG1GC,
|
||||
config.useCMSGC,
|
||||
config.useTLAB,
|
||||
config.useBiasedLocking,
|
||||
boolean[] booleanFlags = { graalHotSpotVMConfig.cAssertions, // Debug VM
|
||||
graalHotSpotVMConfig.useCompressedOops,
|
||||
graalHotSpotVMConfig.useCompressedClassPointers,
|
||||
graalHotSpotVMConfig.compactFields,
|
||||
graalHotSpotVMConfig.useG1GC,
|
||||
graalHotSpotVMConfig.useCMSGC,
|
||||
graalHotSpotVMConfig.useTLAB,
|
||||
graalHotSpotVMConfig.useBiasedLocking,
|
||||
TieredAOT.getValue(),
|
||||
config.enableContended,
|
||||
config.restrictContended,
|
||||
graalHotSpotVMConfig.enableContended,
|
||||
graalHotSpotVMConfig.restrictContended,
|
||||
graphBuilderConfig.omitAssertions()
|
||||
};
|
||||
|
||||
int[] intFlags = { config.narrowOopShift,
|
||||
config.narrowKlassShift,
|
||||
config.contendedPaddingWidth,
|
||||
config.fieldsAllocationStyle,
|
||||
config.objectAlignment,
|
||||
config.codeSegmentSize,
|
||||
int[] intFlags = { graalHotSpotVMConfig.narrowOopShift,
|
||||
graalHotSpotVMConfig.narrowKlassShift,
|
||||
graalHotSpotVMConfig.contendedPaddingWidth,
|
||||
graalHotSpotVMConfig.fieldsAllocationStyle,
|
||||
graalHotSpotVMConfig.objectAlignment,
|
||||
graalHotSpotVMConfig.codeSegmentSize,
|
||||
};
|
||||
// @formatter:on
|
||||
|
||||
|
||||
@ -77,10 +77,14 @@ public class AOTBackend {
|
||||
this.filters = filters;
|
||||
providers = backend.getProviders();
|
||||
codeCache = providers.getCodeCache();
|
||||
graphBuilderSuite = initGraphBuilderSuite(backend);
|
||||
graphBuilderSuite = initGraphBuilderSuite(backend, main.options.compileWithAssertions);
|
||||
highTierContext = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.ALL);
|
||||
}
|
||||
|
||||
public PhaseSuite<HighTierContext> getGraphBuilderSuite() {
|
||||
return graphBuilderSuite;
|
||||
}
|
||||
|
||||
private Suites getSuites() {
|
||||
// create suites every time, as we modify options for the compiler
|
||||
return backend.getSuites().getDefaultSuites();
|
||||
@ -146,14 +150,14 @@ public class AOTBackend {
|
||||
return backend.getRuntime().getVMConfig().cAssertions;
|
||||
}
|
||||
|
||||
private static PhaseSuite<HighTierContext> initGraphBuilderSuite(HotSpotBackend backend) {
|
||||
private static PhaseSuite<HighTierContext> initGraphBuilderSuite(HotSpotBackend backend, boolean compileWithAssertions) {
|
||||
PhaseSuite<HighTierContext> graphBuilderSuite = backend.getSuites().getDefaultGraphBuilderSuite().copy();
|
||||
ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class);
|
||||
GraphBuilderConfiguration baseConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig();
|
||||
|
||||
// Use all default plugins.
|
||||
Plugins plugins = baseConfig.getPlugins();
|
||||
GraphBuilderConfiguration aotConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
|
||||
GraphBuilderConfiguration aotConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true).withOmitAssertions(!compileWithAssertions);
|
||||
|
||||
iterator.next();
|
||||
iterator.remove();
|
||||
|
||||
@ -45,6 +45,7 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@ -54,8 +55,14 @@ import jdk.tools.jaotc.collect.ClassCollector;
|
||||
import jdk.tools.jaotc.utils.Timer;
|
||||
|
||||
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler;
|
||||
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
|
||||
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
|
||||
import org.graalvm.compiler.hotspot.HotSpotHostBackend;
|
||||
import org.graalvm.compiler.java.GraphBuilderPhase;
|
||||
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
|
||||
import org.graalvm.compiler.phases.BasePhase;
|
||||
import org.graalvm.compiler.phases.PhaseSuite;
|
||||
import org.graalvm.compiler.phases.tiers.HighTierContext;
|
||||
import org.graalvm.compiler.runtime.RuntimeProvider;
|
||||
|
||||
import jdk.vm.ci.meta.MetaAccessProvider;
|
||||
@ -144,11 +151,16 @@ public class Main implements LogPrinter {
|
||||
void process(Main task, String opt, String arg) {
|
||||
task.options.methodList = arg;
|
||||
}
|
||||
}, new Option(" --compile-for-tiered Generated profiling code for tiered compilation", false, "--compile-for-tiered") {
|
||||
}, new Option(" --compile-for-tiered Generate profiling code for tiered compilation", false, "--compile-for-tiered") {
|
||||
@Override
|
||||
void process(Main task, String opt, String arg) {
|
||||
TieredAOT.setValue(true);
|
||||
}
|
||||
}, new Option(" --compile-with-assertions Compile assertions", false, "--compile-with-assertions") {
|
||||
@Override
|
||||
void process(Main task, String opt, String arg) {
|
||||
task.options.compileWithAssertions = true;
|
||||
}
|
||||
}, new Option(" --classpath <path> Specify where to find user class files", true, "--classpath", "--class-path") {
|
||||
@Override
|
||||
void process(Main task, String opt, String arg) {
|
||||
@ -225,15 +237,16 @@ public class Main implements LogPrinter {
|
||||
*/
|
||||
private static final int COMPILER_THREADS = 16;
|
||||
|
||||
int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors());
|
||||
public int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors());
|
||||
|
||||
public boolean ignoreClassLoadingErrors;
|
||||
public boolean exitOnError;
|
||||
boolean info;
|
||||
boolean verbose;
|
||||
boolean debug;
|
||||
boolean help;
|
||||
boolean version;
|
||||
public boolean info;
|
||||
public boolean verbose;
|
||||
public boolean debug;
|
||||
public boolean help;
|
||||
public boolean version;
|
||||
public boolean compileWithAssertions;
|
||||
}
|
||||
|
||||
/* package */final Options options = new Options();
|
||||
@ -356,6 +369,11 @@ public class Main implements LogPrinter {
|
||||
AOTCompiler compiler = new AOTCompiler(this, aotBackend, options.threads);
|
||||
classes = compiler.compileClasses(classes);
|
||||
|
||||
GraalHotSpotVMConfig graalHotSpotVMConfig = runtime.getVMConfig();
|
||||
PhaseSuite<HighTierContext> graphBuilderSuite = aotBackend.getGraphBuilderSuite();
|
||||
ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class);
|
||||
GraphBuilderConfiguration graphBuilderConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig();
|
||||
|
||||
// Free memory!
|
||||
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
|
||||
printMemoryUsage();
|
||||
@ -364,7 +382,7 @@ public class Main implements LogPrinter {
|
||||
System.gc();
|
||||
}
|
||||
|
||||
BinaryContainer binaryContainer = new BinaryContainer(runtime.getVMConfig(), JVM_VERSION);
|
||||
BinaryContainer binaryContainer = new BinaryContainer(graalHotSpotVMConfig, graphBuilderConfig, JVM_VERSION);
|
||||
DataBuilder dataBuilder = new DataBuilder(this, backend, classes, binaryContainer);
|
||||
dataBuilder.prepareData();
|
||||
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
*/
|
||||
package org.graalvm.compiler.hotspot.meta;
|
||||
|
||||
import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
|
||||
import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode;
|
||||
import static org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider.FieldReadEnabledInImmutableCode;
|
||||
|
||||
@ -112,11 +111,6 @@ public final class HotSpotNodePlugin implements NodePlugin, TypePlugin {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (GeneratePIC.getValue()) {
|
||||
if (field.isSynthetic() && field.getName().startsWith("$assertionsDisabled")) {
|
||||
return tryReadField(b, field, null);
|
||||
}
|
||||
}
|
||||
if (b.parsingIntrinsic() && wordOperationPlugin.handleLoadStaticField(b, field)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
#include "aot/aotCodeHeap.hpp"
|
||||
#include "aot/aotLoader.hpp"
|
||||
#include "classfile/javaAssertions.hpp"
|
||||
#include "gc/g1/heapRegion.hpp"
|
||||
#include "gc/shared/gcLocker.hpp"
|
||||
#include "interpreter/abstractInterpreter.hpp"
|
||||
@ -706,6 +707,12 @@ bool AOTCodeHeap::load_klass_data(instanceKlassHandle kh, Thread* thread) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_lib->config()->_omitAssertions && JavaAssertions::enabled(kh->name()->as_C_string(), kh->class_loader() == NULL)) {
|
||||
// Assertions are omitted in the compiled code, but are enabled right now. Bail out.
|
||||
sweep_dependent_methods(klass_data);
|
||||
return false;
|
||||
}
|
||||
|
||||
NOT_PRODUCT( aot_klasses_found++; )
|
||||
|
||||
log_trace(aot, class, load)("found %s in %s for classloader %p tid=" INTPTR_FORMAT, kh->internal_name(), _lib->name(), kh->class_loader_data(), p2i(thread));
|
||||
@ -714,7 +721,7 @@ bool AOTCodeHeap::load_klass_data(instanceKlassHandle kh, Thread* thread) {
|
||||
// Set klass's Resolve (second) got cell.
|
||||
_metaspace_got[klass_data->_got_index] = kh();
|
||||
|
||||
// Initialize global symbols of the DSO to the correspondingVM symbol values.
|
||||
// Initialize global symbols of the DSO to the corresponding VM symbol values.
|
||||
link_global_lib_symbols();
|
||||
|
||||
int methods_offset = klass_data->_compiled_methods_offset;
|
||||
|
||||
@ -88,7 +88,7 @@ typedef struct {
|
||||
} AOTHeader;
|
||||
|
||||
typedef struct {
|
||||
enum { CONFIG_SIZE = 11 + 7 * 4 };
|
||||
enum { CONFIG_SIZE = 12 + 7 * 4 };
|
||||
int _config_size;
|
||||
int _narrowOopShift;
|
||||
int _narrowKlassShift;
|
||||
@ -108,6 +108,7 @@ typedef struct {
|
||||
bool _tieredAOT;
|
||||
bool _enableContended;
|
||||
bool _restrictContended;
|
||||
bool _omitAssertions;
|
||||
} AOTConfiguration;
|
||||
|
||||
class AOTLib : public CHeapObj<mtCode> {
|
||||
|
||||
@ -94,7 +94,7 @@ ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Depen
|
||||
_metaspace(NULL), _unloading(false), _klasses(NULL),
|
||||
_modules(NULL), _packages(NULL),
|
||||
_claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
|
||||
_next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1),
|
||||
_next(NULL), _dependencies(dependencies),
|
||||
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true,
|
||||
Monitor::_safepoint_check_never)) {
|
||||
TRACE_INIT_ID(this);
|
||||
|
||||
@ -204,9 +204,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
// Support for walking class loader data objects
|
||||
ClassLoaderData* _next; /// Next loader_datas created
|
||||
|
||||
// CDS
|
||||
int _shared_class_loader_id;
|
||||
|
||||
// ReadOnly and ReadWrite metaspaces (static because only on the null
|
||||
// class loader for now).
|
||||
static Metaspace* _ro_metaspace;
|
||||
@ -338,15 +335,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
Metaspace* rw_metaspace();
|
||||
void initialize_shared_metaspaces();
|
||||
|
||||
int shared_class_loader_id() const {
|
||||
return _shared_class_loader_id;
|
||||
}
|
||||
void set_shared_class_loader_id(int id) {
|
||||
assert(id >= 0, "sanity");
|
||||
assert(_shared_class_loader_id <0, "cannot be assigned more than once");
|
||||
_shared_class_loader_id = id;
|
||||
}
|
||||
|
||||
TRACE_DEFINE_TRACE_ID_METHODS;
|
||||
};
|
||||
|
||||
|
||||
@ -29,7 +29,6 @@
|
||||
#include "classfile/dictionary.hpp"
|
||||
|
||||
class ClassFileStream;
|
||||
class SerializeClosure;
|
||||
|
||||
class SystemDictionaryShared: public SystemDictionary {
|
||||
public:
|
||||
@ -79,8 +78,6 @@ public:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void serialize(SerializeClosure* soc) {}
|
||||
|
||||
// The (non-application) CDS implementation supports only classes in the boot
|
||||
// class loader, which ensures that the verification constraints are the same
|
||||
// during archive creation time and runtime. Thus we can do the constraint checks
|
||||
|
||||
@ -149,16 +149,17 @@ void CodeCache::check_heap_sizes(size_t non_nmethod_size, size_t profiled_size,
|
||||
size_t total_size = non_nmethod_size + profiled_size + non_profiled_size;
|
||||
// Prepare error message
|
||||
const char* error = "Invalid code heap sizes";
|
||||
err_msg message("NonNMethodCodeHeapSize (%zuK) + ProfiledCodeHeapSize (%zuK) + NonProfiledCodeHeapSize (%zuK) = %zuK",
|
||||
err_msg message("NonNMethodCodeHeapSize (" SIZE_FORMAT "K) + ProfiledCodeHeapSize (" SIZE_FORMAT "K)"
|
||||
" + NonProfiledCodeHeapSize (" SIZE_FORMAT "K) = " SIZE_FORMAT "K",
|
||||
non_nmethod_size/K, profiled_size/K, non_profiled_size/K, total_size/K);
|
||||
|
||||
if (total_size > cache_size) {
|
||||
// Some code heap sizes were explicitly set: total_size must be <= cache_size
|
||||
message.append(" is greater than ReservedCodeCacheSize (%zuK).", cache_size/K);
|
||||
message.append(" is greater than ReservedCodeCacheSize (" SIZE_FORMAT "K).", cache_size/K);
|
||||
vm_exit_during_initialization(error, message);
|
||||
} else if (all_set && total_size != cache_size) {
|
||||
// All code heap sizes were explicitly set: total_size must equal cache_size
|
||||
message.append(" is not equal to ReservedCodeCacheSize (%zuK).", cache_size/K);
|
||||
message.append(" is not equal to ReservedCodeCacheSize (" SIZE_FORMAT "K).", cache_size/K);
|
||||
vm_exit_during_initialization(error, message);
|
||||
}
|
||||
}
|
||||
@ -267,7 +268,7 @@ void CodeCache::initialize_heaps() {
|
||||
uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3);
|
||||
if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) {
|
||||
vm_exit_during_initialization(err_msg(
|
||||
"Not enough space in non-nmethod code heap to run VM: %zuK < %zuK",
|
||||
"Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K",
|
||||
non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K));
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, 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
|
||||
@ -69,12 +69,12 @@ protected:
|
||||
void initialize(HeapWord* bottom, HeapWord* end, size_t target_elem_size_in_bytes, size_t mapping_granularity_in_bytes) {
|
||||
assert(mapping_granularity_in_bytes > 0, "just checking");
|
||||
assert(is_power_of_2(mapping_granularity_in_bytes),
|
||||
"mapping granularity must be power of 2, is %zd", mapping_granularity_in_bytes);
|
||||
"mapping granularity must be power of 2, is " SIZE_FORMAT, mapping_granularity_in_bytes);
|
||||
assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0,
|
||||
"bottom mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT,
|
||||
"bottom mapping area address must be a multiple of mapping granularity " SIZE_FORMAT ", is " PTR_FORMAT,
|
||||
mapping_granularity_in_bytes, p2i(bottom));
|
||||
assert((uintptr_t)end % mapping_granularity_in_bytes == 0,
|
||||
"end mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT,
|
||||
"end mapping area address must be a multiple of mapping granularity " SIZE_FORMAT ", is " PTR_FORMAT,
|
||||
mapping_granularity_in_bytes, p2i(end));
|
||||
size_t num_target_elems = pointer_delta(end, bottom, mapping_granularity_in_bytes);
|
||||
idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes;
|
||||
|
||||
@ -145,10 +145,6 @@ void MetaspaceShared::serialize(SerializeClosure* soc, GrowableArray<MemRegion>
|
||||
StringTable::serialize(soc, string_space, space_size);
|
||||
soc->do_tag(--tag);
|
||||
|
||||
// Dump/restore the misc information for system dictionary
|
||||
SystemDictionaryShared::serialize(soc);
|
||||
soc->do_tag(--tag);
|
||||
|
||||
soc->do_tag(666);
|
||||
}
|
||||
|
||||
|
||||
@ -238,8 +238,8 @@ functionExit(JavaThread* thr)
|
||||
size_t live_handles = handles->get_number_of_live_handles();
|
||||
if (live_handles > planned_capacity) {
|
||||
IN_VM(
|
||||
tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",
|
||||
live_handles, planned_capacity);
|
||||
tty->print_cr("WARNING: JNI local refs: " SIZE_FORMAT ", exceeds capacity: " SIZE_FORMAT,
|
||||
live_handles, planned_capacity);
|
||||
thr->print_stack();
|
||||
)
|
||||
// Complain just the once, reset to current + warn threshold
|
||||
|
||||
@ -1246,7 +1246,7 @@ static jvmtiError JNICALL
|
||||
<xsl:param name="name"/>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="$name"/>
|
||||
<xsl:text>=0x%zx</xsl:text>
|
||||
<xsl:text>=" SIZE_FORMAT_HEX "</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="jfloat|jdouble" mode="traceInFormat">
|
||||
|
||||
@ -469,14 +469,18 @@ void Flag::print_on(outputStream* st, bool withComments, bool printRanges) {
|
||||
}
|
||||
|
||||
if (!printRanges) {
|
||||
// Use some named constants to make code more readable.
|
||||
const unsigned int nSpaces = 10;
|
||||
const unsigned int maxFlagLen = 40 + nSpaces;
|
||||
|
||||
// The print below assumes that the flag name is 40 characters or less.
|
||||
// This works for most flags, but there are exceptions. Our longest flag
|
||||
// name right now is UseAdaptiveGenerationSizePolicyAtMajorCollection and
|
||||
// its minor collection buddy. These are 48 characters. We use a buffer of
|
||||
// 10 spaces below to adjust the space between the flag value and the
|
||||
// nSpaces spaces below to adjust the space between the flag value and the
|
||||
// column of flag type and origin that is printed in the end of the line.
|
||||
char spaces[10 + 1] = " ";
|
||||
st->print("%9s %-40s = ", _type, _name);
|
||||
char spaces[nSpaces + 1] = " ";
|
||||
st->print("%9s %-*s = ", _type, maxFlagLen-nSpaces, _name);
|
||||
|
||||
if (is_bool()) {
|
||||
st->print("%-20s", get_bool() ? "true" : "false");
|
||||
@ -509,9 +513,12 @@ void Flag::print_on(outputStream* st, bool withComments, bool printRanges) {
|
||||
}
|
||||
else st->print("%-20s", "");
|
||||
}
|
||||
assert(strlen(_name) < 50, "Flag name is longer than expected");
|
||||
spaces[50 - MAX2((size_t)40, strlen(_name))] = '\0';
|
||||
st->print("%s", spaces);
|
||||
// Make sure we do not punch a '\0' at a negative char array index.
|
||||
unsigned int nameLen = (unsigned int)strlen(_name);
|
||||
if (nameLen <= maxFlagLen) {
|
||||
spaces[maxFlagLen - MAX2(maxFlagLen-nSpaces, nameLen)] = '\0';
|
||||
st->print("%s", spaces);
|
||||
}
|
||||
print_kind_and_origin(st);
|
||||
|
||||
#ifndef PRODUCT
|
||||
|
||||
@ -292,7 +292,7 @@ void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) {
|
||||
char *opt = (char *)os::malloc(opt_len, mtInternal);
|
||||
if (opt == NULL) {
|
||||
output()->print_cr("JVMTI agent attach failed: "
|
||||
"Could not allocate %zu bytes for argument.",
|
||||
"Could not allocate " SIZE_FORMAT " bytes for argument.",
|
||||
opt_len);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -214,7 +214,7 @@ private:
|
||||
case 2: do_conjoint_swap<uint16_t,D>(src, dst, byte_count); break;
|
||||
case 4: do_conjoint_swap<uint32_t,D>(src, dst, byte_count); break;
|
||||
case 8: do_conjoint_swap<uint64_t,D>(src, dst, byte_count); break;
|
||||
default: guarantee(false, "do_conjoint_swap: Invalid elem_size %zd\n", elem_size);
|
||||
default: guarantee(false, "do_conjoint_swap: Invalid elem_size " SIZE_FORMAT "\n", elem_size);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -55,7 +55,6 @@ compiler/types/correctness/OffTest.java 8066173 generic-all
|
||||
|
||||
gc/g1/humongousObjects/objectGraphTest/TestObjectGraphAfterGC.java 8156755 generic-all
|
||||
gc/survivorAlignment/TestPromotionToSurvivor.java 8129886 generic-all
|
||||
gc/stress/TestStressG1Humongous.java 8171045 generic-all
|
||||
|
||||
#############################################################################
|
||||
|
||||
|
||||
@ -46,6 +46,7 @@ requires.properties= \
|
||||
vm.gc.Parallel \
|
||||
vm.gc.ConcMarkSweep \
|
||||
vm.jvmci \
|
||||
vm.cpu.features \
|
||||
vm.debug
|
||||
|
||||
# Tests using jtreg 4.2 b04 features
|
||||
|
||||
@ -1,132 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2012, 2015, 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.
|
||||
#
|
||||
#
|
||||
|
||||
## some tests require path to find test source dir
|
||||
if [ "${TESTSRC}" = "" ]
|
||||
then
|
||||
TESTSRC=${PWD}
|
||||
echo "TESTSRC not set. Using "${TESTSRC}" as default"
|
||||
fi
|
||||
echo "TESTSRC=${TESTSRC}"
|
||||
## Adding common setup Variables for running shell tests.
|
||||
. ${TESTSRC}/../../../test_env.sh
|
||||
|
||||
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -Xinternalversion | sed 's/amd64/x86/' | grep "x86" | grep "Server VM" | grep "debug"
|
||||
|
||||
# Only test fastdebug Server VM on x86
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
echo "Test Passed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# grep for support integer multiply vectors (cpu with SSE4.1)
|
||||
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -XX:+PrintMiscellaneous -XX:+Verbose -version | grep "cores per cpu" | grep "sse4.1"
|
||||
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
SSE=2
|
||||
else
|
||||
SSE=4
|
||||
fi
|
||||
|
||||
cp ${TESTSRC}${FS}TestIntVect.java .
|
||||
${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} -d . TestIntVect.java
|
||||
|
||||
# CICompilerCount must be at least 2 with -TieredCompilation
|
||||
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -Xbatch -XX:-TieredCompilation \
|
||||
-XX:CICompilerCount=2 -XX:+PrintCompilation -XX:+TraceNewVectors \
|
||||
compiler.c2.cr7200264.TestIntVect > test.out 2>&1
|
||||
|
||||
COUNT=`grep AddVI test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 4 ]
|
||||
then
|
||||
echo "Test Failed: AddVI $COUNT < 4"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# AddVI is generated for test_subc
|
||||
COUNT=`grep SubVI test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 4 ]
|
||||
then
|
||||
echo "Test Failed: SubVI $COUNT < 4"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# MulVI is only supported with SSE4.1.
|
||||
if [ $SSE -gt 3 ]
|
||||
then
|
||||
# LShiftVI+SubVI is generated for test_mulc
|
||||
COUNT=`grep MulVI test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 2 ]
|
||||
then
|
||||
echo "Test Failed: MulVI $COUNT < 2"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
COUNT=`grep AndV test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 3 ]
|
||||
then
|
||||
echo "Test Failed: AndV $COUNT < 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COUNT=`grep OrV test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 3 ]
|
||||
then
|
||||
echo "Test Failed: OrV $COUNT < 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COUNT=`grep XorV test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 3 ]
|
||||
then
|
||||
echo "Test Failed: XorV $COUNT < 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# LShiftVI+SubVI is generated for test_mulc
|
||||
COUNT=`grep LShiftVI test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 5 ]
|
||||
then
|
||||
echo "Test Failed: LShiftVI $COUNT < 5"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COUNT=`grep RShiftVI test.out | sed '/URShiftVI/d' | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 3 ]
|
||||
then
|
||||
echo "Test Failed: RShiftVI $COUNT < 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COUNT=`grep URShiftVI test.out | wc -l | awk '{print $1}'`
|
||||
if [ $COUNT -lt 3 ]
|
||||
then
|
||||
echo "Test Failed: URShiftVI $COUNT < 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
68
hotspot/test/compiler/c2/cr7200264/TestDriver.java
Normal file
68
hotspot/test/compiler/c2/cr7200264/TestDriver.java
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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.
|
||||
*/
|
||||
|
||||
package compiler.c2.cr7200264;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import jdk.test.lib.Asserts;
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
|
||||
public class TestDriver {
|
||||
private final Map<String, Long> expectedVectorizationNumbers
|
||||
= new HashMap<>();
|
||||
|
||||
public void addExpectedVectorization(String v, long num) {
|
||||
expectedVectorizationNumbers.put(v, num);
|
||||
}
|
||||
|
||||
public void run() throws Throwable {
|
||||
verifyVectorizationNumber(executeApplication());
|
||||
}
|
||||
|
||||
private List<String> executeApplication() throws Throwable {
|
||||
OutputAnalyzer outputAnalyzer = ProcessTools.executeTestJvmAllArgs(
|
||||
"-Xbatch",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+PrintCompilation",
|
||||
"-XX:+TraceNewVectors",
|
||||
TestIntVect.class.getName());
|
||||
outputAnalyzer.shouldHaveExitValue(0);
|
||||
return outputAnalyzer.asLines();
|
||||
}
|
||||
|
||||
private void verifyVectorizationNumber(List<String> vectorizationLog) {
|
||||
for (Map.Entry<String, Long> entry : expectedVectorizationNumbers.entrySet()) {
|
||||
String v = "\t" + entry.getKey();
|
||||
long actualNum = vectorizationLog.stream()
|
||||
.filter(s -> s.contains(v)).count();
|
||||
long expectedNum = entry.getValue();
|
||||
Asserts.assertGTE(actualNum, expectedNum,
|
||||
"Unexpected " + entry.getKey() + " number");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016, 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
|
||||
@ -21,14 +21,6 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7200264
|
||||
* @summary 7192963 changes disabled shift vectors
|
||||
*
|
||||
* @run shell Test7200264.sh
|
||||
*/
|
||||
|
||||
package compiler.c2.cr7200264;
|
||||
/*
|
||||
* Copy of test/compiler/6340864/TestIntVect.java without performance tests.
|
||||
|
||||
48
hotspot/test/compiler/c2/cr7200264/TestSSE2IntVect.java
Normal file
48
hotspot/test/compiler/c2/cr7200264/TestSSE2IntVect.java
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7200264
|
||||
* @summary 7192963 changes disabled shift vectors
|
||||
* @requires vm.cpu.features ~= ".*sse2.*" & vm.debug & vm.flavor == "server"
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.cr7200264.TestSSE2IntVect
|
||||
*/
|
||||
|
||||
package compiler.c2.cr7200264;
|
||||
|
||||
public class TestSSE2IntVect {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
TestDriver test = new TestDriver();
|
||||
test.addExpectedVectorization("AddVI", 4);
|
||||
test.addExpectedVectorization("SubVI", 4);
|
||||
test.addExpectedVectorization("AndV", 3);
|
||||
test.addExpectedVectorization("OrV", 3);
|
||||
test.addExpectedVectorization("XorV", 3);
|
||||
test.addExpectedVectorization("LShiftVI", 5);
|
||||
test.addExpectedVectorization("RShiftVI", 3);
|
||||
test.addExpectedVectorization("URShiftVI", 3);
|
||||
test.run();
|
||||
}
|
||||
}
|
||||
41
hotspot/test/compiler/c2/cr7200264/TestSSE4IntVect.java
Normal file
41
hotspot/test/compiler/c2/cr7200264/TestSSE4IntVect.java
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7200264
|
||||
* @summary 7192963 changes disabled shift vectors
|
||||
* @requires vm.cpu.features ~= ".*sse4\\.1.*" & vm.debug & vm.flavor == "server"
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.cr7200264.TestSSE4IntVect
|
||||
*/
|
||||
|
||||
package compiler.c2.cr7200264;
|
||||
|
||||
public class TestSSE4IntVect {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
TestDriver test = new TestDriver();
|
||||
test.addExpectedVectorization("MulVI", 2);
|
||||
test.run();
|
||||
}
|
||||
}
|
||||
@ -27,7 +27,7 @@
|
||||
* @requires vm.gc.G1
|
||||
* @summary Verify that heap shrinks after GC in the presence of fragmentation
|
||||
* due to humongous objects
|
||||
* @library /test/lib
|
||||
* @library /test/lib /
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* @modules java.management/sun.management
|
||||
* @run main/othervm -XX:-ExplicitGCInvokesConcurrent -XX:MinHeapFreeRatio=10
|
||||
@ -40,6 +40,8 @@ import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryUsage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.text.NumberFormat;
|
||||
import gc.testlibrary.Helpers;
|
||||
import static jdk.test.lib.Asserts.*;
|
||||
|
||||
public class TestHumongousShrinkHeap {
|
||||
@ -70,9 +72,9 @@ public class TestHumongousShrinkHeap {
|
||||
|
||||
System.out.format("Running with %s initial heap size of %s maximum heap size. "
|
||||
+ "Will allocate humongous object of %s size %d times.%n",
|
||||
MemoryUsagePrinter.humanReadableByteCount(TOTAL_MEMORY, false),
|
||||
MemoryUsagePrinter.humanReadableByteCount(MAX_MEMORY, false),
|
||||
MemoryUsagePrinter.humanReadableByteCount(HUMON_SIZE, false),
|
||||
MemoryUsagePrinter.NF.format(TOTAL_MEMORY),
|
||||
MemoryUsagePrinter.NF.format(MAX_MEMORY),
|
||||
MemoryUsagePrinter.NF.format(HUMON_SIZE),
|
||||
HUMON_COUNT
|
||||
);
|
||||
new TestHumongousShrinkHeap().test();
|
||||
@ -134,24 +136,16 @@ public class TestHumongousShrinkHeap {
|
||||
*/
|
||||
class MemoryUsagePrinter {
|
||||
|
||||
public static String humanReadableByteCount(long bytes, boolean si) {
|
||||
int unit = si ? 1000 : 1024;
|
||||
if (bytes < unit) {
|
||||
return bytes + " B";
|
||||
}
|
||||
int exp = (int) (Math.log(bytes) / Math.log(unit));
|
||||
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
|
||||
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
|
||||
}
|
||||
public static final NumberFormat NF = Helpers.numberFormatter();
|
||||
|
||||
public static void printMemoryUsage(String label) {
|
||||
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
|
||||
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
|
||||
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
|
||||
label,
|
||||
humanReadableByteCount(memusage.getInit(), false),
|
||||
humanReadableByteCount(memusage.getUsed(), false),
|
||||
humanReadableByteCount(memusage.getCommitted(), false),
|
||||
NF.format(memusage.getInit()),
|
||||
NF.format(memusage.getUsed()),
|
||||
NF.format(memusage.getCommitted()),
|
||||
freeratio * 100
|
||||
);
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
* "..................................H"
|
||||
* 3. invoke gc and check that memory returned to the system (amount of committed memory got down)
|
||||
*
|
||||
* @library /test/lib
|
||||
* @library /test/lib /
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* java.management/sun.management
|
||||
*/
|
||||
@ -39,10 +39,12 @@ import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryUsage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.text.NumberFormat;
|
||||
import static jdk.test.lib.Asserts.*;
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
import com.sun.management.HotSpotDiagnosticMXBean;
|
||||
import gc.testlibrary.Helpers;
|
||||
|
||||
public class TestShrinkDefragmentedHeap {
|
||||
// Since we store all the small objects, they become old and old regions are also allocated at the bottom of the heap
|
||||
@ -114,8 +116,8 @@ public class TestShrinkDefragmentedHeap {
|
||||
|
||||
private void allocate() {
|
||||
System.out.format("Will allocate objects of small size = %s and humongous size = %s",
|
||||
MemoryUsagePrinter.humanReadableByteCount(SMALL_OBJS_SIZE, false),
|
||||
MemoryUsagePrinter.humanReadableByteCount(HUMONG_OBJS_SIZE, false)
|
||||
MemoryUsagePrinter.NF.format(SMALL_OBJS_SIZE),
|
||||
MemoryUsagePrinter.NF.format(HUMONG_OBJS_SIZE)
|
||||
);
|
||||
|
||||
for (int i = 0; i < ALLOCATE_COUNT; i++) {
|
||||
@ -170,24 +172,16 @@ public class TestShrinkDefragmentedHeap {
|
||||
*/
|
||||
static class MemoryUsagePrinter {
|
||||
|
||||
public static String humanReadableByteCount(long bytes, boolean si) {
|
||||
int unit = si ? 1000 : 1024;
|
||||
if (bytes < unit) {
|
||||
return bytes + " B";
|
||||
}
|
||||
int exp = (int) (Math.log(bytes) / Math.log(unit));
|
||||
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
|
||||
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
|
||||
}
|
||||
public static final NumberFormat NF = Helpers.numberFormatter();
|
||||
|
||||
public static void printMemoryUsage(String label) {
|
||||
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
|
||||
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
|
||||
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
|
||||
label,
|
||||
humanReadableByteCount(memusage.getInit(), false),
|
||||
humanReadableByteCount(memusage.getUsed(), false),
|
||||
humanReadableByteCount(memusage.getCommitted(), false),
|
||||
NF.format(memusage.getInit()),
|
||||
NF.format(memusage.getUsed()),
|
||||
NF.format(memusage.getCommitted()),
|
||||
freeratio * 100
|
||||
);
|
||||
}
|
||||
|
||||
@ -28,15 +28,17 @@
|
||||
* @summary Verify that the heap shrinks after full GC according to the current values of the Min/MaxHeapFreeRatio flags
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* @modules jdk.management
|
||||
* @library /test/lib
|
||||
* @library /test/lib /
|
||||
* @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -Xmx1g -verbose:gc TestDynShrinkHeap
|
||||
*/
|
||||
import jdk.test.lib.DynamicVMOption;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryUsage;
|
||||
import java.util.ArrayList;
|
||||
import java.text.NumberFormat;
|
||||
import static jdk.test.lib.Asserts.assertLessThan;
|
||||
import com.sun.management.HotSpotDiagnosticMXBean;
|
||||
import gc.testlibrary.Helpers;
|
||||
|
||||
public class TestDynShrinkHeap {
|
||||
|
||||
@ -101,24 +103,16 @@ public class TestDynShrinkHeap {
|
||||
*/
|
||||
class MemoryUsagePrinter {
|
||||
|
||||
public static String humanReadableByteCount(long bytes, boolean si) {
|
||||
int unit = si ? 1000 : 1024;
|
||||
if (bytes < unit) {
|
||||
return bytes + " B";
|
||||
}
|
||||
int exp = (int) (Math.log(bytes) / Math.log(unit));
|
||||
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
|
||||
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
|
||||
}
|
||||
public static final NumberFormat NF = Helpers.numberFormatter();
|
||||
|
||||
public static void printMemoryUsage(String label) {
|
||||
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
|
||||
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
|
||||
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
|
||||
label,
|
||||
humanReadableByteCount(memusage.getInit(), true),
|
||||
humanReadableByteCount(memusage.getUsed(), true),
|
||||
humanReadableByteCount(memusage.getCommitted(), true),
|
||||
NF.format(memusage.getInit()),
|
||||
NF.format(memusage.getUsed()),
|
||||
NF.format(memusage.getCommitted()),
|
||||
freeratio * 100
|
||||
);
|
||||
}
|
||||
|
||||
@ -28,14 +28,9 @@
|
||||
* @summary Stress G1 by humongous allocations in situation near OOM
|
||||
* @requires vm.gc.G1
|
||||
* @requires !vm.flightRecorder
|
||||
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=4m
|
||||
* -Dtimeout=120 -Dthreads=3 -Dhumongoussize=1.1 -Dregionsize=4 TestStressG1Humongous
|
||||
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=16m
|
||||
* -Dtimeout=120 -Dthreads=5 -Dhumongoussize=2.1 -Dregionsize=16 TestStressG1Humongous
|
||||
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=32m
|
||||
* -Dtimeout=120 -Dthreads=4 -Dhumongoussize=0.6 -Dregionsize=32 TestStressG1Humongous
|
||||
* @run main/othervm/timeout=700 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=1m
|
||||
* -Dtimeout=600 -Dthreads=7 -Dhumongoussize=0.6 -Dregionsize=1 TestStressG1Humongous
|
||||
* @library /test/lib
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* @run driver/timeout=1300 TestStressG1Humongous
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -44,8 +39,45 @@ import java.util.Collections;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class TestStressG1Humongous {
|
||||
import jdk.test.lib.Platform;
|
||||
import jdk.test.lib.Utils;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
|
||||
public class TestStressG1Humongous{
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// Limit heap size on 32-bit platforms
|
||||
int heapSize = Platform.is32bit() ? 512 : 1024;
|
||||
// Heap size, region size, threads, humongous size, timeout
|
||||
run(heapSize, 4, 3, 1.1, 120);
|
||||
run(heapSize, 16, 5, 2.1, 120);
|
||||
run(heapSize, 32, 4, 0.6, 120);
|
||||
run(heapSize, 1, 7, 0.6, 600);
|
||||
}
|
||||
|
||||
private static void run(int heapSize, int regionSize, int threads, double humongousSize, int timeout)
|
||||
throws Exception {
|
||||
ArrayList<String> options = new ArrayList<>();
|
||||
Collections.addAll(options, Utils.getTestJavaOpts());
|
||||
Collections.addAll(options,
|
||||
"-Xlog:gc=debug",
|
||||
"-Xmx" + heapSize + "m",
|
||||
"-XX:+UseG1GC",
|
||||
"-XX:G1HeapRegionSize=" + regionSize + "m",
|
||||
"-Dtimeout=" + timeout,
|
||||
"-Dthreads=" + threads,
|
||||
"-Dhumongoussize=" + humongousSize,
|
||||
"-Dregionsize=" + regionSize,
|
||||
TestStressG1HumongousImpl.class.getName()
|
||||
);
|
||||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(options.toArray(new String[options.size()]));
|
||||
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||
output.shouldHaveExitValue(0);
|
||||
}
|
||||
}
|
||||
|
||||
class TestStressG1HumongousImpl {
|
||||
// Timeout in seconds
|
||||
private static final int TIMEOUT = Integer.getInteger("timeout", 60);
|
||||
private static final int THREAD_COUNT = Integer.getInteger("threads", 2);
|
||||
@ -60,10 +92,10 @@ public class TestStressG1Humongous {
|
||||
public static final List<Object> GARBAGE = Collections.synchronizedList(new ArrayList<>());
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
new TestStressG1Humongous().run();
|
||||
new TestStressG1HumongousImpl().run();
|
||||
}
|
||||
|
||||
public TestStressG1Humongous() {
|
||||
public TestStressG1HumongousImpl() {
|
||||
isRunning = true;
|
||||
threads = new Thread[THREAD_COUNT];
|
||||
alocatedObjectsCount = new AtomicInteger(0);
|
||||
|
||||
@ -31,6 +31,9 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.DecimalFormatSymbols;
|
||||
import java.text.NumberFormat;
|
||||
|
||||
public class Helpers {
|
||||
|
||||
@ -320,4 +323,16 @@ public class Helpers {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a number formatter instance which prints numbers in a human
|
||||
* readable form, like 9_223_372_036_854_775_807.
|
||||
*/
|
||||
public static NumberFormat numberFormatter() {
|
||||
DecimalFormat df = new DecimalFormat();
|
||||
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
|
||||
dfs.setGroupingSeparator('_');
|
||||
dfs.setDecimalSeparator('.');
|
||||
df.setDecimalFormatSymbols(dfs);
|
||||
return df;
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,12 +21,9 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.RuntimeMXBean;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
|
||||
import sun.management.VMManagement;
|
||||
|
||||
@ -38,7 +35,7 @@ public class JMapHProfLargeHeapProc {
|
||||
buildLargeHeap(args);
|
||||
|
||||
// Print our pid on stdout
|
||||
System.out.println("PID[" + getProcessId() + "]");
|
||||
System.out.println("PID[" + ProcessTools.getProcessId() + "]");
|
||||
|
||||
// Wait for input before termination
|
||||
System.in.read();
|
||||
@ -50,22 +47,4 @@ public class JMapHProfLargeHeapProc {
|
||||
}
|
||||
}
|
||||
|
||||
public static int getProcessId() throws Exception {
|
||||
|
||||
// Get the current process id using a reflection hack
|
||||
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
|
||||
Field jvm = runtime.getClass().getDeclaredField("jvm");
|
||||
|
||||
jvm.setAccessible(true);
|
||||
VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime);
|
||||
|
||||
Method pid_method = mgmt.getClass().getDeclaredMethod("getProcessId");
|
||||
|
||||
pid_method.setAccessible(true);
|
||||
|
||||
int pid = (Integer) pid_method.invoke(mgmt);
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -90,6 +90,9 @@ public class JMapHProfLargeHeapTest {
|
||||
try (Scanner largeHeapScanner = new Scanner(
|
||||
largeHeapProc.getInputStream());) {
|
||||
String pidstring = null;
|
||||
if (!largeHeapScanner.hasNext()) {
|
||||
throw new RuntimeException ("Test failed: could not open largeHeapScanner.");
|
||||
}
|
||||
while ((pidstring = largeHeapScanner.findInLine("PID\\[[0-9].*\\]")) == null) {
|
||||
Thread.sleep(500);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user