--- a/hotspot/make/lib/JvmOverrideFiles.gmk Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/make/lib/JvmOverrideFiles.gmk Fri Jun 10 10:13:30 2016 -0700
@@ -153,6 +153,13 @@
# mode, so don't optimize sharedRuntimeTrig.cpp at all.
BUILD_LIBJVM_sharedRuntimeTrig.cpp_CXXFLAGS := $(CXX_O_FLAG_NONE)
+ ifneq ($(DEBUG_LEVEL),slowdebug)
+ # Compiling jvmtiEnterTrace.cpp with full optimization needs more than 30min
+ # (mostly because of '-qhot=level=1' and the more than 1300 'log_trace' calls
+ # which cause a lot of template expansion).
+ BUILD_LIBJVM_jvmtiEnterTrace.cpp_OPTIMIZATION := LOW
+ endif
+
# Disable ELF decoder on AIX (AIX uses XCOFF).
JVM_EXCLUDE_PATTERNS += elf
--- a/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -68,7 +68,6 @@
if (b->number_of_preds() > 1) {
int id = b->first_lir_instruction_id();
ResourceBitMap regs(FrameMap::nof_fpu_regs);
- regs.clear();
iw.walk_to(id); // walk after the first instruction (always a label) of the block
assert(iw.current_position() == id, "did not walk completely to id");
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java Fri Jun 10 10:13:30 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -96,6 +96,8 @@
narrowOopShiftField = type.getCIntegerField("_narrow_oop._shift");
narrowKlassBaseField = type.getAddressField("_narrow_klass._base");
narrowKlassShiftField = type.getCIntegerField("_narrow_klass._shift");
+
+ UniverseExt.initialize(heapConstructor);
}
public Universe() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/UniverseExt.java Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,31 @@
+/*
+ * 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 sun.jvm.hotspot.memory;
+
+import sun.jvm.hotspot.runtime.*;
+
+public class UniverseExt {
+ public static void initialize(VirtualConstructor heapConstructor) { }
+}
--- a/hotspot/src/share/vm/c1/c1_IR.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_IR.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -147,10 +147,8 @@
_wrote_volatile = false;
_start = NULL;
- if (osr_bci == -1) {
- _requires_phi_function.clear();
- } else {
- // selective creation of phi functions is not possibel in osr-methods
+ if (osr_bci != -1) {
+ // selective creation of phi functions is not possibel in osr-methods
_requires_phi_function.set_range(0, method->max_locals());
}
@@ -540,7 +538,6 @@
{
TRACE_LINEAR_SCAN(2, tty->print_cr("***** computing linear-scan block order"));
- init_visited();
count_edges(start_block, NULL);
if (compilation()->is_profiling()) {
@@ -646,7 +643,6 @@
TRACE_LINEAR_SCAN(3, tty->print_cr("----- marking loops"));
_loop_map = BitMap2D(_num_loops, _max_block_id);
- _loop_map.clear();
for (int i = _loop_end_blocks.length() - 1; i >= 0; i--) {
BlockBegin* loop_end = _loop_end_blocks.at(i);
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -1387,7 +1387,6 @@
void LIRGenerator::set_vreg_flag(int vreg_num, VregFlag f) {
if (_vreg_flags.size_in_bits() == 0) {
BitMap2D temp(100, num_vreg_flags);
- temp.clear();
_vreg_flags = temp;
}
_vreg_flags.at_put_grow(vreg_num, f, true);
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -562,14 +562,13 @@
LIR_OpVisitState visitor;
BitMap2D local_interval_in_loop = BitMap2D(_num_virtual_regs, num_loops());
- local_interval_in_loop.clear();
// iterate all blocks
for (int i = 0; i < num_blocks; i++) {
BlockBegin* block = block_at(i);
- ResourceBitMap live_gen(live_size); live_gen.clear();
- ResourceBitMap live_kill(live_size); live_kill.clear();
+ ResourceBitMap live_gen(live_size);
+ ResourceBitMap live_kill(live_size);
if (block->is_set(BlockBegin::exception_entry_flag)) {
// Phi functions at the begin of an exception handler are
@@ -715,8 +714,8 @@
block->set_live_gen (live_gen);
block->set_live_kill(live_kill);
- block->set_live_in (ResourceBitMap(live_size)); block->live_in().clear();
- block->set_live_out (ResourceBitMap(live_size)); block->live_out().clear();
+ block->set_live_in (ResourceBitMap(live_size));
+ block->set_live_out (ResourceBitMap(live_size));
TRACE_LINEAR_SCAN(4, tty->print("live_gen B%d ", block->block_id()); print_bitmap(block->live_gen()));
TRACE_LINEAR_SCAN(4, tty->print("live_kill B%d ", block->block_id()); print_bitmap(block->live_kill()));
@@ -741,7 +740,7 @@
bool change_occurred;
bool change_occurred_in_block;
int iteration_count = 0;
- ResourceBitMap live_out(live_set_size()); live_out.clear(); // scratch set for calculations
+ ResourceBitMap live_out(live_set_size()); // scratch set for calculations
// Perform a backward dataflow analysis to compute live_out and live_in for each block.
// The loop is executed until a fixpoint is reached (no changes in an iteration)
@@ -827,7 +826,6 @@
// check that the live_in set of the first block is empty
ResourceBitMap live_in_args(ir()->start()->live_in().size());
- live_in_args.clear();
if (!ir()->start()->live_in().is_same(live_in_args)) {
#ifdef ASSERT
tty->print_cr("Error: live_in set of first block must be empty (when this fails, virtual registers are used before they are defined)");
@@ -1774,8 +1772,8 @@
int num_blocks = block_count();
MoveResolver move_resolver(this);
- ResourceBitMap block_completed(num_blocks); block_completed.clear();
- ResourceBitMap already_resolved(num_blocks); already_resolved.clear();
+ ResourceBitMap block_completed(num_blocks);
+ ResourceBitMap already_resolved(num_blocks);
int i;
for (i = 0; i < num_blocks; i++) {
@@ -3750,7 +3748,6 @@
ResourceBitMap used_regs(LinearScan::nof_regs + allocator()->frame_map()->argcount() + allocator()->max_spills());
- used_regs.clear();
if (!_multiple_reads_allowed) {
for (i = 0; i < _mapping_from.length(); i++) {
Interval* it = _mapping_from.at(i);
@@ -6319,7 +6316,6 @@
void ControlFlowOptimizer::delete_jumps_to_return(BlockList* code) {
#ifdef ASSERT
ResourceBitMap return_converted(BlockBegin::number_of_blocks());
- return_converted.clear();
#endif
for (int i = code->length() - 1; i >= 0; i--) {
--- a/hotspot/src/share/vm/c1/c1_ValueSet.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_ValueSet.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -53,7 +53,6 @@
};
inline ValueSet::ValueSet() : _map(Instruction::number_of_instructions()) {
- _map.clear();
}
--- a/hotspot/src/share/vm/ci/ciMethod.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -449,7 +449,6 @@
OopMapCache::compute_one_oop_map(get_Method(), bci, &mask);
int mask_size = max_locals();
ResourceBitMap result(mask_size);
- result.clear();
int i;
for (i = 0; i < mask_size ; i++ ) {
if (mask.is_oop(i)) result.set_bit(i);
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -4673,6 +4673,7 @@
}
// Unqualified names may not contain the characters '.', ';', '[', or '/'.
+// In class names, '/' separates unqualified names. This is verified in this function also.
// Method names also may not contain the characters '<' or '>', unless <init>
// or <clinit>. Note that method names may not be <init> or <clinit> in this
// method. Because these names have been checked as special cases before
@@ -4698,8 +4699,16 @@
if (ch == ';' || ch == '[' ) {
return false; // do not permit '.', ';', or '['
}
- if (type != ClassFileParser::LegalClass && ch == '/') {
- return false; // do not permit '/' unless it's class name
+ if (ch == '/') {
+ // check for '//' or leading or trailing '/' which are not legal
+ // unqualified name must not be empty
+ if (type == ClassFileParser::LegalClass) {
+ if (p == name || p+1 >= name+length || *(p+1) == '/') {
+ return false;
+ }
+ } else {
+ return false; // do not permit '/' unless it's class name
+ }
}
if (type == ClassFileParser::LegalMethod && (ch == '<' || ch == '>')) {
return false; // do not permit '<' or '>' in method names
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -181,26 +181,59 @@
}
// Used to obtain the package name from a fully qualified class name.
-// It is the responsibility of the caller to establish ResourceMark.
-const char* ClassLoader::package_from_name(const char* class_name) {
- const char* last_slash = strrchr(class_name, '/');
+// It is the responsibility of the caller to establish a ResourceMark.
+const char* ClassLoader::package_from_name(const char* const class_name, bool* bad_class_name) {
+ if (class_name == NULL) {
+ if (bad_class_name != NULL) {
+ *bad_class_name = true;
+ }
+ return NULL;
+ }
+
+ if (bad_class_name != NULL) {
+ *bad_class_name = false;
+ }
+
+ const char* const last_slash = strrchr(class_name, '/');
if (last_slash == NULL) {
// No package name
return NULL;
}
- int length = last_slash - class_name;
+
+ char* class_name_ptr = (char*) class_name;
+ // Skip over '['s
+ if (*class_name_ptr == '[') {
+ do {
+ class_name_ptr++;
+ } while (*class_name_ptr == '[');
- // A class name could have just the slash character in the name,
- // resulting in a negative length.
+ // Fully qualified class names should not contain a 'L'.
+ // Set bad_class_name to true to indicate that the package name
+ // could not be obtained due to an error condition.
+ // In this situation, is_same_class_package returns false.
+ if (*class_name_ptr == 'L') {
+ if (bad_class_name != NULL) {
+ *bad_class_name = true;
+ }
+ return NULL;
+ }
+ }
+
+ int length = last_slash - class_name_ptr;
+
+ // A class name could have just the slash character in the name.
if (length <= 0) {
// No package name
+ if (bad_class_name != NULL) {
+ *bad_class_name = true;
+ }
return NULL;
}
// drop name after last slash (including slash)
// Ex., "java/lang/String.class" => "java/lang"
char* pkg_name = NEW_RESOURCE_ARRAY(char, length + 1);
- strncpy(pkg_name, class_name, length);
+ strncpy(pkg_name, class_name_ptr, length);
*(pkg_name+length) = '\0';
return (const char *)pkg_name;
@@ -228,8 +261,9 @@
ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
// construct full path name
- char path[JVM_MAXPATHLEN];
- if (jio_snprintf(path, sizeof(path), "%s%s%s", _dir, os::file_separator(), name) == -1) {
+ char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
+ if (jio_snprintf(path, JVM_MAXPATHLEN, "%s%s%s", _dir, os::file_separator(), name) == -1) {
+ FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
return NULL;
}
// check if file exists
@@ -256,6 +290,7 @@
if (UsePerfData) {
ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
}
+ FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
// Resource allocated
return new ClassFileStream(buffer,
st.st_size,
@@ -264,6 +299,7 @@
}
}
}
+ FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
return NULL;
}
@@ -344,9 +380,9 @@
if (is_multi_ver) {
int n;
- char entry_name[JVM_MAXPATHLEN];
+ char* entry_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
if (version > 0) {
- n = jio_snprintf(entry_name, sizeof(entry_name), "META-INF/versions/%d/%s", version, name);
+ n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", version, name);
entry_name[n] = '\0';
buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
if (buffer == NULL) {
@@ -355,7 +391,7 @@
}
if (buffer == NULL) {
for (int i = cur_ver; i >= base_version; i--) {
- n = jio_snprintf(entry_name, sizeof(entry_name), "META-INF/versions/%d/%s", i, name);
+ n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", i, name);
entry_name[n] = '\0';
buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
if (buffer != NULL) {
@@ -363,6 +399,7 @@
}
}
}
+ FREE_RESOURCE_ARRAY(char, entry_name, JVM_MAXPATHLEN);
}
}
return buffer;
@@ -508,7 +545,8 @@
const char* name, const char* extension, void* arg) {
if (strcmp(extension, "class") == 0) {
Thread* THREAD = Thread::current();
- char path[JIMAGE_MAX_PATH];
+ ResourceMark rm(THREAD);
+ char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JIMAGE_MAX_PATH);
jio_snprintf(path, JIMAGE_MAX_PATH - 1, "%s/%s.class", package, name);
ClassLoader::compile_the_world_in(path, *(Handle*)arg, THREAD);
return !HAS_PENDING_EXCEPTION;
@@ -750,9 +788,10 @@
JavaThread* thread = JavaThread::current();
ClassPathEntry* new_entry = NULL;
if ((st->st_mode & S_IFREG) == S_IFREG) {
+ ResourceMark rm(thread);
// Regular file, should be a zip or jimage file
// Canonicalized filename
- char canonical_path[JVM_MAXPATHLEN];
+ char* canonical_path = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, JVM_MAXPATHLEN);
if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
// This matches the classic VM
if (throw_exception) {
@@ -777,14 +816,13 @@
if (zip != NULL && error_msg == NULL) {
new_entry = new ClassPathZipEntry(zip, path, is_boot_append);
} else {
- ResourceMark rm(thread);
char *msg;
if (error_msg == NULL) {
- msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ;
+ msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, strlen(path) + 128); ;
jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
} else {
int len = (int)(strlen(path) + strlen(error_msg) + 128);
- msg = NEW_RESOURCE_ARRAY(char, len); ;
+ msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, len); ;
jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
}
// Don't complain about bad jar files added via -Xbootclasspath/a:.
@@ -1112,13 +1150,11 @@
assert(fullq_class_name != NULL, "just checking");
// Get package name from fully qualified class name.
- const char *cp = strrchr(fullq_class_name, '/');
+ ResourceMark rm;
+ const char *cp = package_from_name(fullq_class_name);
if (cp != NULL) {
- int len = cp - fullq_class_name;
- PackageEntryTable* pkg_entry_tbl =
- ClassLoaderData::the_null_class_loader_data()->packages();
- TempNewSymbol pkg_symbol =
- SymbolTable::new_symbol(fullq_class_name, len, CHECK_false);
+ PackageEntryTable* pkg_entry_tbl = ClassLoaderData::the_null_class_loader_data()->packages();
+ TempNewSymbol pkg_symbol = SymbolTable::new_symbol(cp, CHECK_false);
PackageEntry* pkg_entry = pkg_entry_tbl->lookup_only(pkg_symbol);
if (pkg_entry != NULL) {
assert(classpath_index != -1, "Unexpected classpath_index");
@@ -1226,11 +1262,9 @@
// jimage, it is determined by the class path entry.
jshort loader_type = ClassLoader::APP_LOADER;
if (e->is_jrt()) {
- int length = 0;
- const jbyte* pkg_string = InstanceKlass::package_from_name(class_name, length);
- if (pkg_string != NULL) {
- ResourceMark rm;
- TempNewSymbol pkg_name = SymbolTable::new_symbol((const char*)pkg_string, length, THREAD);
+ ResourceMark rm;
+ TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK_0);
+ if (pkg_name != NULL) {
const char* pkg_name_C_string = (const char*)(pkg_name->as_C_string());
ClassPathImageEntry* cpie = (ClassPathImageEntry*)e;
JImageFile* jimage = cpie->jimage();
--- a/hotspot/src/share/vm/classfile/classLoader.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -444,7 +444,9 @@
static bool string_ends_with(const char* str, const char* str_to_find);
// obtain package name from a fully qualified class name
- static const char* package_from_name(const char* class_name);
+ // *bad_class_name is set to true if there's a problem with parsing class_name, to
+ // distinguish from a class_name with no package name, as both cases have a NULL return value
+ static const char* package_from_name(const char* const class_name, bool* bad_class_name = NULL);
static bool is_jrt(const char* name) { return string_ends_with(name, MODULES_IMAGE_NAME); }
--- a/hotspot/src/share/vm/classfile/classLoaderExt.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoaderExt.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -54,12 +54,14 @@
const s2 classpath_index,
instanceKlassHandle result, TRAPS) {
if (ClassLoader::add_package(_file_name, classpath_index, THREAD)) {
+#if INCLUDE_CDS
if (DumpSharedSpaces) {
s2 classloader_type = ClassLoader::classloader_type(
class_name, e, classpath_index, CHECK_(result));
result->set_shared_classpath_index(classpath_index);
result->set_class_loader_type(classloader_type);
}
+#endif
return result;
} else {
return instanceKlassHandle(); // NULL
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -70,6 +70,7 @@
#include "services/threadService.hpp"
#include "trace/traceMacros.hpp"
#include "utilities/macros.hpp"
+#include "utilities/stringUtils.hpp"
#include "utilities/ticks.hpp"
#if INCLUDE_CDS
#include "classfile/sharedClassUtil.hpp"
@@ -1154,12 +1155,10 @@
// It is illegal to define classes in the "java." package from
// JVM_DefineClass or jni_DefineClass unless you're the bootclassloader
ResourceMark rm(THREAD);
- char* name = parsed_name->as_C_string();
- char* index = strrchr(name, '/');
- *index = '\0'; // chop to just the package name
- while ((index = strchr(name, '/')) != NULL) {
- *index = '.'; // replace '/' with '.' in package name
- }
+ TempNewSymbol pkg_name = InstanceKlass::package_from_name(parsed_name, CHECK_NULL);
+ assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
+ char* name = pkg_name->as_C_string();
+ StringUtils::replace_no_expand(name, "/", ".");
const char* msg_text = "Prohibited package name: ";
size_t len = strlen(msg_text) + strlen(name) + 1;
char* message = NEW_RESOURCE_ARRAY(char, len);
@@ -1257,6 +1256,7 @@
bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
instanceKlassHandle ik,
Handle class_loader, TRAPS) {
+ ResourceMark rm;
int path_index = ik->shared_classpath_index();
SharedClassPathEntry* ent =
(SharedClassPathEntry*)FileMapInfo::shared_classpath(path_index);
@@ -1270,12 +1270,11 @@
TempNewSymbol pkg_name = NULL;
PackageEntry* pkg_entry = NULL;
ModuleEntry* mod_entry = NULL;
- int length = 0;
+ const char* pkg_string = NULL;
ClassLoaderData* loader_data = class_loader_data(class_loader);
- const jbyte* pkg_string = InstanceKlass::package_from_name(class_name, length);
- if (pkg_string != NULL) {
- pkg_name = SymbolTable::new_symbol((const char*)pkg_string,
- length, CHECK_(false));
+ pkg_name = InstanceKlass::package_from_name(class_name, CHECK_false);
+ if (pkg_name != NULL) {
+ pkg_string = pkg_name->as_C_string();
if (loader_data != NULL) {
pkg_entry = loader_data->packages()->lookup_only(pkg_name);
}
@@ -1432,15 +1431,14 @@
instanceKlassHandle nh = instanceKlassHandle(); // null Handle
if (class_loader.is_null()) {
- int length = 0;
+ ResourceMark rm;
PackageEntry* pkg_entry = NULL;
bool search_only_bootloader_append = false;
ClassLoaderData *loader_data = class_loader_data(class_loader);
// Find the package in the boot loader's package entry table.
- const jbyte* pkg_string = InstanceKlass::package_from_name(class_name, length);
- if (pkg_string != NULL) {
- TempNewSymbol pkg_name = SymbolTable::new_symbol((const char*)pkg_string, length, CHECK_(nh));
+ TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK_NULL);
+ if (pkg_name != NULL) {
pkg_entry = loader_data->packages()->lookup_only(pkg_name);
}
@@ -1477,7 +1475,7 @@
assert(!DumpSharedSpaces, "Archive dumped after module system initialization");
// After the module system has been initialized, check if the class'
// package is in a module defined to the boot loader.
- if (pkg_string == NULL || pkg_entry == NULL || pkg_entry->in_unnamed_module()) {
+ if (pkg_name == NULL || pkg_entry == NULL || pkg_entry->in_unnamed_module()) {
// Class is either in the unnamed package, in a named package
// within a module not defined to the boot loader or in a
// a named package within the unnamed module. In all cases,
--- a/hotspot/src/share/vm/classfile/systemDictionaryShared.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionaryShared.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -48,7 +48,7 @@
static bool is_shared_class_visible_for_classloader(
instanceKlassHandle ik,
Handle class_loader,
- const jbyte* pkg_string,
+ const char* pkg_string,
Symbol* pkg_name,
PackageEntry* pkg_entry,
ModuleEntry* mod_entry,
--- a/hotspot/src/share/vm/compiler/methodLiveness.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/compiler/methodLiveness.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -137,11 +137,6 @@
_arena = arena;
_method = method;
_bit_map_size_bits = method->max_locals();
-
-
-#ifdef COMPILER1
- _bci_block_start.clear();
-#endif
}
void MethodLiveness::compute_liveness() {
@@ -587,14 +582,6 @@
new (analyzer->arena()) GrowableArray<MethodLiveness::BasicBlock*>(analyzer->arena(), 5, 0, NULL);
_exception_predecessors =
new (analyzer->arena()) GrowableArray<MethodLiveness::BasicBlock*>(analyzer->arena(), 5, 0, NULL);
- _normal_exit.clear();
- _exception_exit.clear();
- _entry.clear();
-
- // this initialization is not strictly necessary.
- // _gen and _kill are cleared at the beginning of compute_gen_kill_range()
- _gen.clear();
- _kill.clear();
}
@@ -1020,7 +1007,6 @@
_last_bci = bci;
}
- answer.clear();
answer.set_union(_normal_exit);
answer.set_difference(_kill);
answer.set_union(_gen);
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -3474,7 +3474,8 @@
double remove_self_forwards_start = os::elapsedTime();
remove_self_forwarding_pointers();
- _preserved_marks_set.restore(workers());
+ SharedRestorePreservedMarksTaskExecutor task_executor(workers());
+ _preserved_marks_set.restore(&task_executor);
g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
}
--- a/hotspot/src/share/vm/gc/parallel/psPromotionManager.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psPromotionManager.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "gc/parallel/gcTaskManager.hpp"
#include "gc/parallel/mutableSpace.hpp"
#include "gc/parallel/parallelScavengeHeap.hpp"
#include "gc/parallel/psOldGen.hpp"
@@ -237,8 +238,53 @@
_preserved_marks = preserved_marks;
}
+class ParRestoreGCTask : public GCTask {
+private:
+ const uint _id;
+ PreservedMarksSet* const _preserved_marks_set;
+ volatile size_t* const _total_size_addr;
+
+public:
+ virtual char* name() {
+ return (char*) "preserved mark restoration task";
+ }
+
+ virtual void do_it(GCTaskManager* manager, uint which){
+ _preserved_marks_set->get(_id)->restore_and_increment(_total_size_addr);
+ }
+
+ ParRestoreGCTask(uint id,
+ PreservedMarksSet* preserved_marks_set,
+ volatile size_t* total_size_addr)
+ : _id(id),
+ _preserved_marks_set(preserved_marks_set),
+ _total_size_addr(total_size_addr) { }
+};
+
+class PSRestorePreservedMarksTaskExecutor : public RestorePreservedMarksTaskExecutor {
+private:
+ GCTaskManager* _gc_task_manager;
+
+public:
+ PSRestorePreservedMarksTaskExecutor(GCTaskManager* gc_task_manager)
+ : _gc_task_manager(gc_task_manager) { }
+
+ void restore(PreservedMarksSet* preserved_marks_set,
+ volatile size_t* total_size_addr) {
+ // GCTask / GCTaskQueue are ResourceObjs
+ ResourceMark rm;
+
+ GCTaskQueue* q = GCTaskQueue::create();
+ for (uint i = 0; i < preserved_marks_set->num(); i += 1) {
+ q->enqueue(new ParRestoreGCTask(i, preserved_marks_set, total_size_addr));
+ }
+ _gc_task_manager->execute_and_wait(q);
+ }
+};
+
void PSPromotionManager::restore_preserved_marks() {
- _preserved_marks_set->restore(PSScavenge::gc_task_manager());
+ PSRestorePreservedMarksTaskExecutor task_executor(PSScavenge::gc_task_manager());
+ _preserved_marks_set->restore(&task_executor);
}
void PSPromotionManager::drain_stacks_depth(bool totally_drain) {
--- a/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -739,7 +739,8 @@
eden()->object_iterate(&rspc);
from()->object_iterate(&rspc);
- _preserved_marks_set.restore(GenCollectedHeap::heap()->workers());
+ SharedRestorePreservedMarksTaskExecutor task_executor(GenCollectedHeap::heap()->workers());
+ _preserved_marks_set.restore(&task_executor);
}
void DefNewGeneration::handle_promotion_failure(oop old) {
--- a/hotspot/src/share/vm/gc/shared/preservedMarks.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/preservedMarks.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -28,9 +28,6 @@
#include "memory/allocation.inline.hpp"
#include "memory/resourceArea.hpp"
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
-#include "gc/parallel/gcTaskManager.hpp"
-#endif
void PreservedMarks::restore() {
while (!_stack.is_empty()) {
@@ -40,6 +37,15 @@
assert_empty();
}
+void PreservedMarks::restore_and_increment(volatile size_t* const total_size_addr) {
+ const size_t stack_size = size();
+ restore();
+ // Only do the atomic add if the size is > 0.
+ if (stack_size > 0) {
+ Atomic::add(stack_size, total_size_addr);
+ }
+}
+
#ifndef PRODUCT
void PreservedMarks::assert_empty() {
assert(_stack.is_empty(), "stack expected to be empty, size = "SIZE_FORMAT,
@@ -82,13 +88,7 @@
virtual void work(uint worker_id) {
uint task_id = 0;
while (!_sub_tasks.is_task_claimed(/* reference */ task_id)) {
- PreservedMarks* const preserved_marks = _preserved_marks_set->get(task_id);
- const size_t size = preserved_marks->size();
- preserved_marks->restore();
- // Only do the atomic add if the size is > 0.
- if (size > 0) {
- Atomic::add(size, _total_size_addr);
- }
+ _preserved_marks_set->get(task_id)->restore_and_increment(_total_size_addr);
}
_sub_tasks.all_tasks_completed();
}
@@ -104,53 +104,6 @@
}
};
-void PreservedMarksSet::restore_internal(WorkGang* workers,
- volatile size_t* total_size_addr) {
- assert(workers != NULL, "pre-condition");
- ParRestoreTask task(workers->active_workers(), this, total_size_addr);
- workers->run_task(&task);
-}
-
-#if INCLUDE_ALL_GCS
-class ParRestoreGCTask : public GCTask {
-private:
- const uint _id;
- PreservedMarksSet* const _preserved_marks_set;
- volatile size_t* const _total_size_addr;
-
-public:
- virtual char* name() { return (char*) "preserved mark restoration task"; }
-
- virtual void do_it(GCTaskManager* manager, uint which) {
- PreservedMarks* const preserved_marks = _preserved_marks_set->get(_id);
- const size_t size = preserved_marks->size();
- preserved_marks->restore();
- // Only do the atomic add if the size is > 0.
- if (size > 0) {
- Atomic::add(size, _total_size_addr);
- }
- }
-
- ParRestoreGCTask(uint id,
- PreservedMarksSet* preserved_marks_set,
- volatile size_t* total_size_addr)
- : _id(id),
- _preserved_marks_set(preserved_marks_set),
- _total_size_addr(total_size_addr) { }
-};
-
-void PreservedMarksSet::restore_internal(GCTaskManager* gc_task_manager,
- volatile size_t* total_size_addr) {
- // GCTask / GCTaskQueue are ResourceObjs
- ResourceMark rm;
-
- GCTaskQueue* q = GCTaskQueue::create();
- for (uint i = 0; i < num(); i += 1) {
- q->enqueue(new ParRestoreGCTask(i, this, total_size_addr));
- }
- gc_task_manager->execute_and_wait(q);
-}
-#endif
void PreservedMarksSet::reclaim() {
assert_empty();
@@ -176,3 +129,16 @@
}
}
#endif // ndef PRODUCT
+
+void SharedRestorePreservedMarksTaskExecutor::restore(PreservedMarksSet* preserved_marks_set,
+ volatile size_t* total_size_addr) {
+ if (_workers == NULL) {
+ for (uint i = 0; i < preserved_marks_set->num(); i += 1) {
+ *total_size_addr += preserved_marks_set->get(i)->size();
+ preserved_marks_set->get(i)->restore();
+ }
+ } else {
+ ParRestoreTask task(_workers->active_workers(), preserved_marks_set, total_size_addr);
+ _workers->run_task(&task);
+ }
+}
--- a/hotspot/src/share/vm/gc/shared/preservedMarks.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/preservedMarks.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -30,7 +30,7 @@
#include "oops/oop.hpp"
#include "utilities/stack.hpp"
-class GCTaskManager;
+class PreservedMarksSet;
class WorkGang;
class PreservedMarks VALUE_OBJ_CLASS_SPEC {
@@ -61,6 +61,7 @@
// reclaim the memory taken up by the stack segments.
void restore();
+ void restore_and_increment(volatile size_t* const _total_size_addr);
inline static void init_forwarded_mark(oop obj);
// Assert the stack is empty and has no cached segments.
@@ -75,6 +76,24 @@
virtual void do_object(oop obj);
};
+class RestorePreservedMarksTaskExecutor {
+public:
+ void virtual restore(PreservedMarksSet* preserved_marks_set,
+ volatile size_t* total_size_addr) = 0;
+};
+
+class SharedRestorePreservedMarksTaskExecutor : public RestorePreservedMarksTaskExecutor {
+private:
+ WorkGang* _workers;
+
+public:
+ SharedRestorePreservedMarksTaskExecutor(WorkGang* workers) : _workers(workers) { }
+
+ void restore(PreservedMarksSet* preserved_marks_set,
+ volatile size_t* total_size_addr);
+
+};
+
class PreservedMarksSet : public CHeapObj<mtGC> {
private:
// true -> _stacks will be allocated in the C heap
@@ -91,13 +110,6 @@
// or == NULL if they have not.
Padded<PreservedMarks>* _stacks;
- // Internal version of restore() that uses a WorkGang for parallelism.
- void restore_internal(WorkGang* workers, volatile size_t* total_size_addr);
-
- // Internal version of restore() that uses a GCTaskManager for parallelism.
- void restore_internal(GCTaskManager* gc_task_manager,
- volatile size_t* total_size_addr);
-
public:
uint num() const { return _num; }
@@ -111,14 +123,11 @@
// Allocate stack array.
void init(uint num);
- // Itrerate over all stacks, restore all presered marks, and reclaim
- // the memory taken up by the stack segments. If the executor is
- // NULL, restoration will be done serially. If the executor is not
- // NULL, restoration could be done in parallel (when it makes
- // sense). Supported executors: WorkGang (Serial, CMS, G1),
- // GCTaskManager (PS).
- template <class E>
- inline void restore(E* executor);
+ // Iterate over all stacks, restore all preserved marks, and reclaim
+ // the memory taken up by the stack segments.
+ // Supported executors: SharedRestorePreservedMarksTaskExecutor (Serial, CMS, G1),
+ // PSRestorePreservedMarksTaskExecutor (PS).
+ inline void restore(RestorePreservedMarksTaskExecutor* executor);
// Reclaim stack array.
void reclaim();
--- a/hotspot/src/share/vm/gc/shared/preservedMarks.inline.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/preservedMarks.inline.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -49,8 +49,7 @@
obj->init_mark();
}
-template <class E>
-inline void PreservedMarksSet::restore(E* executor) {
+inline void PreservedMarksSet::restore(RestorePreservedMarksTaskExecutor* executor) {
volatile size_t total_size = 0;
#ifdef ASSERT
@@ -61,17 +60,7 @@
}
#endif // def ASSERT
- if (executor == NULL) {
- for (uint i = 0; i < _num; i += 1) {
- total_size += get(i)->size();
- get(i)->restore();
- }
- } else {
- // Right now, if the executor is not NULL we do the work in
- // parallel. In the future we might want to do the restoration
- // serially, if there's only a small number of marks per stack.
- restore_internal(executor, &total_size);
- }
+ executor->restore(this, &total_size);
assert_empty();
assert(total_size == total_size_before,
--- a/hotspot/src/share/vm/gc/shared/threadLocalAllocBuffer.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/threadLocalAllocBuffer.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -110,6 +110,7 @@
static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); }
static const size_t max_size() { assert(_max_size != 0, "max_size not set up"); return _max_size; }
+ static const size_t max_size_in_bytes() { return max_size() * BytesPerWord; }
static void set_max_size(size_t max_size) { _max_size = max_size; }
HeapWord* start() const { return _start; }
--- a/hotspot/src/share/vm/memory/metaspace.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -2933,7 +2933,7 @@
// Don't use large pages for the class space.
bool large_pages = false;
-#ifndef AARCH64
+#if !(defined(AARCH64) || defined(AIX))
ReservedSpace metaspace_rs = ReservedSpace(compressed_class_space_size(),
_reserve_alignment,
large_pages,
@@ -2945,18 +2945,25 @@
// bits.
if ((uint64_t)requested_addr + compressed_class_space_size() < 4*G) {
metaspace_rs = ReservedSpace(compressed_class_space_size(),
- _reserve_alignment,
- large_pages,
- requested_addr);
+ _reserve_alignment,
+ large_pages,
+ requested_addr);
}
if (! metaspace_rs.is_reserved()) {
- // Try to align metaspace so that we can decode a compressed klass
- // with a single MOVK instruction. We can do this iff the
+ // Aarch64: Try to align metaspace so that we can decode a compressed
+ // klass with a single MOVK instruction. We can do this iff the
// compressed class base is a multiple of 4G.
- for (char *a = (char*)align_ptr_up(requested_addr, 4*G);
+ // Aix: Search for a place where we can find memory. If we need to load
+ // the base, 4G alignment is helpful, too.
+ size_t increment = AARCH64_ONLY(4*)G;
+ for (char *a = (char*)align_ptr_up(requested_addr, increment);
a < (char*)(1024*G);
- a += 4*G) {
+ a += increment) {
+ if (a == (char *)(32*G)) {
+ // Go faster from here on. Zero-based is no longer possible.
+ increment = 4*G;
+ }
#if INCLUDE_CDS
if (UseSharedSpaces
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -2182,39 +2182,21 @@
return dest;
}
-const jbyte* InstanceKlass::package_from_name(const Symbol* name, int& length) {
- ResourceMark rm;
- length = 0;
+// Used to obtain the package name from a fully qualified class name.
+Symbol* InstanceKlass::package_from_name(const Symbol* name, TRAPS) {
if (name == NULL) {
return NULL;
} else {
- const jbyte* base_name = name->base();
- const jbyte* last_slash = UTF8::strrchr(base_name, name->utf8_length(), '/');
-
- if (last_slash == NULL) {
- // No package name
+ if (name->utf8_length() <= 0) {
return NULL;
- } else {
- // Skip over '['s
- if (*base_name == '[') {
- do {
- base_name++;
- } while (*base_name == '[');
- if (*base_name != 'L') {
- // Fully qualified class names should not contain a 'L'.
- // Set length to -1 to indicate that the package name
- // could not be obtained due to an error condition.
- // In this situtation, is_same_class_package returns false.
- length = -1;
- return NULL;
- }
- }
-
- // Found the package name, look it up in the symbol table.
- length = last_slash - base_name;
- assert(length > 0, "Bad length for package name");
- return base_name;
}
+ ResourceMark rm;
+ const char* package_name = ClassLoader::package_from_name((const char*) name->as_C_string());
+ if (package_name == NULL) {
+ return NULL;
+ }
+ Symbol* pkg_name = SymbolTable::new_symbol(package_name, THREAD);
+ return pkg_name;
}
}
@@ -2230,12 +2212,9 @@
}
void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) {
- int length = 0;
- const jbyte* base_name = package_from_name(name(), length);
-
- if (base_name != NULL && loader_data != NULL) {
- TempNewSymbol pkg_name = SymbolTable::new_symbol((const char*)base_name, length, CHECK);
-
+ TempNewSymbol pkg_name = package_from_name(name(), CHECK);
+
+ if (pkg_name != NULL && loader_data != NULL) {
// Find in class loader's package entry table.
_package_entry = loader_data->packages()->lookup_only(pkg_name);
@@ -2331,20 +2310,18 @@
if (class_loader1 != class_loader2) {
return false;
} else if (class_name1 == class_name2) {
- return true; // skip painful bytewise comparison
+ return true;
} else {
ResourceMark rm;
- // The Symbol*'s are in UTF8 encoding. Since we only need to check explicitly
- // for ASCII characters ('/', 'L', '['), we can keep them in UTF8 encoding.
- // Otherwise, we just compare jbyte values between the strings.
- int length1 = 0;
- int length2 = 0;
- const jbyte *name1 = package_from_name(class_name1, length1);
- const jbyte *name2 = package_from_name(class_name2, length2);
-
- if ((length1 < 0) || (length2 < 0)) {
- // error occurred parsing package name.
+ bool bad_class_name = false;
+ const char* name1 = ClassLoader::package_from_name((const char*) class_name1->as_C_string(), &bad_class_name);
+ if (bad_class_name) {
+ return false;
+ }
+
+ const char* name2 = ClassLoader::package_from_name((const char*) class_name2->as_C_string(), &bad_class_name);
+ if (bad_class_name) {
return false;
}
@@ -2354,13 +2331,13 @@
return name1 == name2;
}
- // Check that package part is identical
- return UTF8::equal(name1, length1, name2, length2);
+ // Check that package is identical
+ return (strcmp(name1, name2) == 0);
}
}
// Returns true iff super_method can be overridden by a method in targetclassname
-// See JSL 3rd edition 8.4.6.1
+// See JLS 3rd edition 8.4.6.1
// Assumes name-signature match
// "this" is InstanceKlass of super_method which must exist
// note that the InstanceKlass of the method in the targetclassname has not always been created yet
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -1108,7 +1108,7 @@
// Naming
const char* signature_name() const;
- static const jbyte* package_from_name(const Symbol* name, int& length);
+ static Symbol* package_from_name(const Symbol* name, TRAPS);
// GC specific object visitors
//
--- a/hotspot/src/share/vm/oops/method.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/oops/method.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -246,7 +246,7 @@
int code_size() const { return constMethod()->code_size(); }
// method size in words
- int method_size() const { return sizeof(Method)/wordSize + is_native() ? 2 : 0; }
+ int method_size() const { return sizeof(Method)/wordSize + ( is_native() ? 2 : 0 ); }
// constant pool for Klass* holding this method
ConstantPool* constants() const { return constMethod()->constants(); }
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -319,15 +319,7 @@
JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
oop mirror = JNIHandles::resolve_external_guard(object);
NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT);
-
- if (mirror->klass() == SystemDictionary::Class_klass() &&
- !java_lang_Class::is_primitive(mirror)) {
- Klass* k = java_lang_Class::as_Klass(mirror);
- assert(k != NULL, "class for non-primitive mirror must exist");
- *size_ptr = (jlong)k->size() * wordSize;
- } else {
- *size_ptr = (jlong)mirror->size() * wordSize;
- }
+ *size_ptr = (jlong)mirror->size() * wordSize;
return JVMTI_ERROR_NONE;
} /* end GetObjectSize */
--- a/hotspot/src/share/vm/runtime/mutexLocker.cpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -274,7 +274,7 @@
def(JfrMsg_lock , Monitor, leaf, true, Monitor::_safepoint_check_always);
def(JfrBuffer_lock , Mutex, leaf, true, Monitor::_safepoint_check_never);
def(JfrThreadGroups_lock , Mutex, leaf, true, Monitor::_safepoint_check_always);
- def(JfrStream_lock , Mutex, nonleaf, true, Monitor::_safepoint_check_never);
+ def(JfrStream_lock , Mutex, leaf+1, true, Monitor::_safepoint_check_never); // ensure to rank lower than 'safepoint'
def(JfrStacktrace_lock , Mutex, special, true, Monitor::_safepoint_check_sometimes);
#endif
--- a/hotspot/src/share/vm/runtime/thread.inline.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/runtime/thread.inline.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -71,9 +71,12 @@
jlong allocated_bytes = OrderAccess::load_acquire(&_allocated_bytes);
if (UseTLAB) {
size_t used_bytes = tlab().used_bytes();
- if ((ssize_t)used_bytes > 0) {
- // More-or-less valid tlab. The load_acquire above should ensure
- // that the result of the add is <= the instantaneous value.
+ if (used_bytes <= ThreadLocalAllocBuffer::max_size_in_bytes()) {
+ // Comparing used_bytes with the maximum allowed size will ensure
+ // that we don't add the used bytes from a semi-initialized TLAB
+ // ending up with incorrect values. There is still a race between
+ // incrementing _allocated_bytes and clearing the TLAB, that might
+ // cause double counting in rare cases.
return allocated_bytes + used_bytes;
}
}
--- a/hotspot/src/share/vm/utilities/bitMap.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/utilities/bitMap.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -435,7 +435,6 @@
void clear_bit(idx_t slot_index, idx_t bit_within_slot_index);
void at_put(idx_t slot_index, idx_t bit_within_slot_index, bool value);
void at_put_grow(idx_t slot_index, idx_t bit_within_slot_index, bool value);
- void clear();
};
// Closure for iterating over BitMaps
--- a/hotspot/src/share/vm/utilities/bitMap.inline.hpp Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/src/share/vm/utilities/bitMap.inline.hpp Fri Jun 10 10:13:30 2016 -0700
@@ -367,8 +367,4 @@
_map.at_put(bit, value);
}
-inline void BitMap2D::clear() {
- _map.clear();
-}
-
#endif // SHARE_VM_UTILITIES_BITMAP_INLINE_HPP
--- a/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java Fri Jun 10 10:13:30 2016 -0700
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2015, 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
@@ -25,6 +25,8 @@
* @test TestTargetSurvivorRatioFlag
* @key gc
* @summary Verify that option TargetSurvivorRatio affects survivor space occupancy after minor GC.
+ * @requires (vm.opt.ExplicitGCInvokesConcurrent == null) | (vm.opt.ExplicitGCInvokesConcurrent == false)
+ * @requires (vm.opt.UseJVMCICompiler == null) | (vm.opt.UseJVMCICompiler == false)
* @library /testlibrary /test/lib
* @modules java.base/jdk.internal.misc
* java.management
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/runtime/test_classLoader.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ *
+ */
+
+#include "classfile/classLoader.hpp"
+#include "memory/resourceArea.hpp"
+#include "unittest.hpp"
+
+// Tests ClassLoader::package_from_name()
+TEST_VM(classLoader, null_class_name) {
+ ResourceMark rm;
+ bool bad_class_name = false;
+ const char* retval= ClassLoader::package_from_name(NULL, &bad_class_name);
+ ASSERT_TRUE(bad_class_name) << "Function did not set bad_class_name with NULL class name";
+ ASSERT_STREQ(retval, NULL) << "Wrong package for NULL class name pointer";
+}
+
+TEST_VM(classLoader, empty_class_name) {
+ ResourceMark rm;
+ const char* retval = ClassLoader::package_from_name("");
+ ASSERT_STREQ(retval, NULL) << "Wrong package for empty string";
+}
+
+TEST_VM(classLoader, no_slash) {
+ ResourceMark rm;
+ const char* retval = ClassLoader::package_from_name("L");
+ ASSERT_STREQ(retval, NULL) << "Wrong package for class with no slashes";
+}
+
+TEST_VM(classLoader, just_slash) {
+ ResourceMark rm;
+ bool bad_class_name = false;
+ const char* retval = ClassLoader::package_from_name("/", &bad_class_name);
+ ASSERT_TRUE(bad_class_name) << "Function did not set bad_class_name with package of length 0";
+ ASSERT_STREQ(retval, NULL) << "Wrong package for class with just slash";
+}
+
+TEST_VM(classLoader, multiple_slashes) {
+ ResourceMark rm;
+ const char* retval = ClassLoader::package_from_name("///");
+ ASSERT_STREQ(retval, "//") << "Wrong package for class with just slashes";
+}
+
+TEST_VM(classLoader, standard_case_1) {
+ ResourceMark rm;
+ bool bad_class_name = true;
+ const char* retval = ClassLoader::package_from_name("package/class", &bad_class_name);
+ ASSERT_FALSE(bad_class_name) << "Function did not reset bad_class_name";
+ ASSERT_STREQ(retval, "package") << "Wrong package for class with one slash";
+}
+
+TEST_VM(classLoader, standard_case_2) {
+ ResourceMark rm;
+ const char* retval = ClassLoader::package_from_name("package/folder/class");
+ ASSERT_STREQ(retval, "package/folder") << "Wrong package for class with multiple slashes";
+}
+
+TEST_VM(classLoader, class_array) {
+ ResourceMark rm;
+ bool bad_class_name = false;
+ const char* retval = ClassLoader::package_from_name("[package/class", &bad_class_name);
+ ASSERT_FALSE(bad_class_name) << "Function set bad_class_name with class array";
+ ASSERT_STREQ(retval, "package") << "Wrong package for class with leading bracket";
+}
+
+TEST_VM(classLoader, class_object_array) {
+ ResourceMark rm;
+ bool bad_class_name = false;
+ const char* retval = ClassLoader::package_from_name("[Lpackage/class", &bad_class_name);
+ ASSERT_TRUE(bad_class_name) << "Function did not set bad_class_name with array of class objects";
+ ASSERT_STREQ(retval, NULL) << "Wrong package for class with leading '[L'";
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/runtime/test_instanceKlass.cpp Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+
+#include "classfile/symbolTable.hpp"
+#include "memory/resourceArea.hpp"
+#include "oops/instanceKlass.hpp"
+#include "unittest.hpp"
+
+// Tests InstanceKlass::package_from_name()
+TEST_VM(instanceKlass, null_symbol) {
+ ResourceMark rm;
+ TempNewSymbol package_sym = InstanceKlass::package_from_name(NULL, NULL);
+ ASSERT_TRUE(package_sym == NULL) << "Wrong package for NULL symbol";
+}
--- a/hotspot/test/runtime/NMT/CommitOverlappingRegions.java Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/test/runtime/NMT/CommitOverlappingRegions.java Fri Jun 10 10:13:30 2016 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -41,7 +41,12 @@
public static WhiteBox wb = WhiteBox.getWhiteBox();
public static void main(String args[]) throws Exception {
OutputAnalyzer output;
+
long size = 32 * 1024;
+ int pagesize = wb.getVMPageSize();
+ if (size < pagesize) { size = pagesize; } // Should be aligned.
+ long sizek = size / 1024;
+
long addr = wb.NMTReserveMemory(8*size);
String pid = Long.toString(ProcessTools.getProcessId());
@@ -52,93 +57,93 @@
// Start: . . . . . . . .
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=0KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=0KB)");
// Committing: * * * . . . . .
// Region: * * * . . . . .
- // Expected Total: 3 x 32KB = 96KB
+ // Expected Total: 3 x sizek KB
wb.NMTCommitMemory(addr + 0*size, 3*size);
// Committing: . . . . * * * .
// Region: * * * . * * * .
- // Expected Total: 6 x 32KB = 192KB
+ // Expected Total: 6 x sizek KB
wb.NMTCommitMemory(addr + 4*size, 3*size);
// Check output after first 2 commits.
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=192KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 6*sizek + "KB)");
// Committing: . . * * * . . .
// Region: * * * * * * * .
- // Expected Total: 7 x 32KB = 224KB
+ // Expected Total: 7 x sizek KB
wb.NMTCommitMemory(addr + 2*size, 3*size);
// Check output after overlapping commit.
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=224KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 7*sizek + "KB)");
// Uncommitting: * * * * * * * *
// Region: . . . . . . . .
- // Expected Total: 0 x 32KB = 0KB
+ // Expected Total: 0 x sizek KB
wb.NMTUncommitMemory(addr + 0*size, 8*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=0KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=0KB)");
// Committing: * * . . . . . .
// Region: * * . . . . . .
- // Expected Total: 2 x 32KB = 64KB
+ // Expected Total: 2 x sizek KB
wb.NMTCommitMemory(addr + 0*size, 2*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=64KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 2*sizek + "KB)");
// Committing: . * * * . . . .
// Region: * * * * . . . .
- // Expected Total: 4 x 32KB = 128KB
+ // Expected Total: 4 x sizek KB
wb.NMTCommitMemory(addr + 1*size, 3*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=128KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 4*sizek + "KB)");
// Uncommitting: * * * . . . . .
// Region: . . . * . . . .
- // Expected Total: 1 x 32KB = 32KB
+ // Expected Total: 1 x sizek KB
wb.NMTUncommitMemory(addr + 0*size, 3*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=32KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 1*sizek + "KB)");
// Committing: . . . * * . . .
// Region: . . . * * . . .
- // Expected Total: 2 x 32KB = 64KB
+ // Expected Total: 2 x sizek KB
wb.NMTCommitMemory(addr + 3*size, 2*size);
System.out.println("Address is " + Long.toHexString(addr + 3*size));
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=64KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 2*sizek + "KB)");
// Committing: . . . . * * . .
// Region: . . . * * * . .
- // Expected Total: 3 x 32KB = 96KB
+ // Expected Total: 3 x sizek KB
wb.NMTCommitMemory(addr + 4*size, 2*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=96KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 3*sizek + "KB)");
// Committing: . . . . . * * .
// Region: . . . * * * * .
- // Expected Total: 4 x 32KB = 128KB
+ // Expected Total: 4 x sizek KB
wb.NMTCommitMemory(addr + 5*size, 2*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=128KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 4*sizek + "KB)");
// Committing: . . . . . . * *
// Region: . . . * * * * *
- // Expected Total: 5 x 32KB = 160KB
+ // Expected Total: 5 x sizek KB
wb.NMTCommitMemory(addr + 6*size, 2*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=160KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=" + 5*sizek + "KB)");
// Uncommitting: * * * * * * * *
// Region: . . . . . . . .
- // Expected Total: 0 x 32KB = 32KB
+ // Expected Total: 0 x sizek KB
wb.NMTUncommitMemory(addr + 0*size, 8*size);
output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=256KB, committed=0KB)");
+ output.shouldContain("Test (reserved=" + 8*sizek + "KB, committed=0KB)");
}
}
--- a/hotspot/test/runtime/SharedArchiveFile/DefaultUseWithClient.java Fri Jun 10 02:43:53 2016 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/DefaultUseWithClient.java Fri Jun 10 10:13:30 2016 -0700
@@ -27,6 +27,7 @@
* @library /testlibrary
* @modules java.base/jdk.internal.misc
* java.management
+ * @ignore 8154204
* @run main DefaultUseWithClient
* @bug 8032224
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/classFileParserBug/TestBadClassName.java Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,57 @@
+/*
+ * 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 8158297
+ * @summary Constant pool utf8 entry for class name cannot have empty qualified name '//'
+ * @compile p1/BadInterface1.jcod
+ * @compile p1/BadInterface2.jcod
+ * @compile UseBadInterface1.jcod
+ * @compile UseBadInterface2.jcod
+ * @run main/othervm -Xverify:all TestBadClassName
+ */
+
+public class TestBadClassName {
+ public static void main(String args[]) throws Throwable {
+
+ System.out.println("Regression test for bug 8042660");
+
+ // Test class name with p1//BadInterface2
+ try {
+ Class newClass = Class.forName("UseBadInterface1");
+ throw new RuntimeException("Expected ClassFormatError exception not thrown");
+ } catch (java.lang.ClassFormatError e) {
+ System.out.println("Test UseBadInterface1 passed test case with illegal class name");
+ }
+
+ // Test class name with p1/BadInterface2/
+ try {
+ Class newClass = Class.forName("UseBadInterface2");
+ throw new RuntimeException("Expected ClassFormatError exception not thrown");
+ } catch (java.lang.ClassFormatError e) {
+ System.out.println("Test UseBadInterface1 passed test case with illegal class name");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/classFileParserBug/UseBadInterface1.jcod Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ *
+ */
+
+// jcod file for UseBadInterface1.java
+// class UseBadInterface1 implements p1.BadInterface1 {
+// int i;
+// UseBadInterface1() {}
+// public static void main(java.lang.String[] unused) { }
+// }
+
+class UseBadInterface1 {
+ 0xCAFEBABE;
+ 0; // minor version
+ 53; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ Method #3 #10; // #1
+ Utf8 "UseBadInterface1.java"; // #2
+ class #4; // #3
+ Utf8 "java/lang/Object"; // #4
+ class #8; // #5
+ Utf8 "([Ljava/lang/String;)V"; // #6
+ class #11; // #7
+ Utf8 "UseBadInterface1"; // #8
+ Utf8 "main"; // #9
+ NameAndType #17 #13; // #10
+ Utf8 "p1//BadInterface1"; // #11
+ Utf8 "SourceFile"; // #12
+ Utf8 "()V"; // #13
+ Utf8 "I"; // #14
+ Utf8 "Code"; // #15
+ Utf8 "i"; // #16
+ Utf8 "<init>"; // #17
+ } // Constant Pool
+
+ 0x0020; // access
+ #5;// this_cpx
+ #3;// super_cpx
+
+ [] { // Interfaces
+ #7;
+ } // Interfaces
+
+ [] { // fields
+ { // Member
+ 0x0000; // access
+ #16; // name_cpx
+ #14; // sig_cpx
+ [] { // Attributes
+ } // Attributes
+ } // Member
+ } // fields
+
+ [] { // methods
+ { // Member
+ 0x0000; // access
+ #17; // name_cpx
+ #13; // sig_cpx
+ [] { // Attributes
+ Attr(#15) { // Code
+ 1; // max_stack
+ 1; // max_locals
+ Bytes[]{
+ 0x2AB70001B1;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ ;
+ { // Member
+ 0x0009; // access
+ #9; // name_cpx
+ #6; // sig_cpx
+ [] { // Attributes
+ Attr(#15) { // Code
+ 0; // max_stack
+ 1; // max_locals
+ Bytes[]{
+ 0xB1;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ } // methods
+
+ [] { // Attributes
+ Attr(#12) { // SourceFile
+ #2;
+ } // end SourceFile
+ } // Attributes
+} // end class UseBadInterface1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/classFileParserBug/UseBadInterface2.jcod Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ *
+ */
+
+// jcod file for UseBadInterface2.java
+// class UseBadInterface2 implements p1.BadInterface2 {
+// int i;
+// UseBadInterface2() {}
+// public static void main(java.lang.String[] unused) { }
+// }
+
+class UseBadInterface2 {
+ 0xCAFEBABE;
+ 0; // minor version
+ 53; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ Method #3 #10; // #1
+ Utf8 "UseBadInterface2.java"; // #2
+ class #4; // #3
+ Utf8 "java/lang/Object"; // #4
+ class #8; // #5
+ Utf8 "([Ljava/lang/String;)V"; // #6
+ class #11; // #7
+ Utf8 "UseBadInterface2"; // #8
+ Utf8 "main"; // #9
+ NameAndType #17 #13; // #10
+ Utf8 "p1/BadInterface2/"; // #11
+ Utf8 "SourceFile"; // #12
+ Utf8 "()V"; // #13
+ Utf8 "I"; // #14
+ Utf8 "Code"; // #15
+ Utf8 "i"; // #16
+ Utf8 "<init>"; // #17
+ } // Constant Pool
+
+ 0x0020; // access
+ #5;// this_cpx
+ #3;// super_cpx
+
+ [] { // Interfaces
+ #7;
+ } // Interfaces
+
+ [] { // fields
+ { // Member
+ 0x0000; // access
+ #16; // name_cpx
+ #14; // sig_cpx
+ [] { // Attributes
+ } // Attributes
+ } // Member
+ } // fields
+
+ [] { // methods
+ { // Member
+ 0x0000; // access
+ #17; // name_cpx
+ #13; // sig_cpx
+ [] { // Attributes
+ Attr(#15) { // Code
+ 1; // max_stack
+ 1; // max_locals
+ Bytes[]{
+ 0x2AB70001B1;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ ;
+ { // Member
+ 0x0009; // access
+ #9; // name_cpx
+ #6; // sig_cpx
+ [] { // Attributes
+ Attr(#15) { // Code
+ 0; // max_stack
+ 1; // max_locals
+ Bytes[]{
+ 0xB1;
+ };
+ [] { // Traps
+ } // end Traps
+ [] { // Attributes
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ } // methods
+
+ [] { // Attributes
+ Attr(#12) { // SourceFile
+ #2;
+ } // end SourceFile
+ } // Attributes
+} // end class UseBadInterface2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/classFileParserBug/p1/BadInterface1.jcod Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ *
+ */
+
+// Interface that should get a ClassFormatException for the "//" in the name
+
+// package p1;
+// public interface cls1 {}
+
+class p1//BadInterface1 {
+ 0xCAFEBABE;
+ 0; // minor version
+ 53; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ class #5; // #1
+ class #6; // #2
+ Utf8 "SourceFile"; // #3
+ Utf8 "BadInterface1.java"; // #4
+ Utf8 "p1//BadInterface1"; // #5
+ Utf8 "java/lang/Object"; // #6
+ } // Constant Pool
+
+ 0x0601; // access
+ #1;// this_cpx
+ #2;// super_cpx
+
+ [] { // Interfaces
+ } // Interfaces
+
+ [] { // fields
+ } // fields
+
+ [] { // methods
+ } // methods
+
+ [] { // Attributes
+ Attr(#3) { // SourceFile
+ #4;
+ } // end SourceFile
+ } // Attributes
+} // end class p1//BadInterface1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/classFileParserBug/p1/BadInterface2.jcod Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ *
+ */
+
+// Interface that should get a ClassFormatException for the trailing "/" in the name
+
+// package p1;
+// public interface cls1 {}
+
+class p1/BadInterface2/ {
+ 0xCAFEBABE;
+ 0; // minor version
+ 53; // version
+ [] { // Constant Pool
+ ; // first element is empty
+ class #5; // #1
+ class #6; // #2
+ Utf8 "SourceFile"; // #3
+ Utf8 "BadInterface2.java"; // #4
+ Utf8 "p1/BadInterface2/"; // #5
+ Utf8 "java/lang/Object"; // #6
+ } // Constant Pool
+
+ 0x0601; // access
+ #1;// this_cpx
+ #2;// super_cpx
+
+ [] { // Interfaces
+ } // Interfaces
+
+ [] { // fields
+ } // fields
+
+ [] { // methods
+ } // methods
+
+ [] { // Attributes
+ Attr(#3) { // SourceFile
+ #4;
+ } // end SourceFile
+ } // Attributes
+} // end class p1/BadInterface2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/GetObjectSizeClass.java Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+import java.io.PrintWriter;
+import jdk.test.lib.*;
+
+/*
+ * @test
+ * @bug 8075030
+ * @summary JvmtiEnv::GetObjectSize reports incorrect java.lang.Class instance size
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * java.compiler
+ * java.instrument
+ * java.management
+ * jdk.jvmstat/sun.jvmstat.monitor
+ * @build ClassFileInstaller jdk.test.lib.* GetObjectSizeClassAgent
+ * @run main ClassFileInstaller GetObjectSizeClassAgent
+ * @run main GetObjectSizeClass
+ */
+public class GetObjectSizeClass {
+ public static void main(String[] args) throws Exception {
+ PrintWriter pw = new PrintWriter("MANIFEST.MF");
+ pw.println("Premain-Class: GetObjectSizeClassAgent");
+ pw.close();
+
+ ProcessBuilder pb = new ProcessBuilder();
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", "agent.jar", "GetObjectSizeClassAgent.class"});
+ pb.start().waitFor();
+
+ ProcessBuilder pt = ProcessTools.createJavaProcessBuilder(true, "-javaagent:agent.jar", "GetObjectSizeClassAgent");
+ OutputAnalyzer output = new OutputAnalyzer(pt.start());
+
+ output.stdoutShouldContain("GetObjectSizeClass passed");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/GetObjectSizeClassAgent.java Fri Jun 10 10:13:30 2016 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+import java.lang.instrument.*;
+
+public class GetObjectSizeClassAgent {
+
+ static Instrumentation instrumentation;
+
+ public static void premain(String agentArgs, Instrumentation instrumentation) {
+ GetObjectSizeClassAgent.instrumentation = instrumentation;
+ }
+
+ public static void main(String[] args) throws Exception {
+ long sizeA = instrumentation.getObjectSize(A.class);
+ long sizeB = instrumentation.getObjectSize(B.class);
+
+ if (sizeA != sizeB) {
+ throw new RuntimeException("java.lang.Class sizes disagree: " + sizeA + " vs. " + sizeB);
+ }
+
+ System.out.println("GetObjectSizeClass passed");
+ }
+
+ static class A {
+ }
+
+ static class B {
+ void m() {}
+ }
+
+}