Merge
This commit is contained in:
commit
f5266ba9b2
@ -274,6 +274,8 @@ void ClassLoaderData::add_class(Klass* k) {
|
||||
MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
||||
Klass* old_value = _klasses;
|
||||
k->set_next_link(old_value);
|
||||
// Make sure linked class is stable, since the class list is walked without a lock
|
||||
OrderAccess::storestore();
|
||||
// link the new item into the list
|
||||
_klasses = k;
|
||||
|
||||
|
@ -307,6 +307,9 @@ bool CompilerOracle::should_print(methodHandle method) {
|
||||
return (check_predicate(PrintCommand, method));
|
||||
}
|
||||
|
||||
bool CompilerOracle::should_print_methods() {
|
||||
return lists[PrintCommand] != NULL;
|
||||
}
|
||||
|
||||
bool CompilerOracle::should_log(methodHandle method) {
|
||||
if (!LogCompilation) return false;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2014, 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
|
||||
@ -73,6 +73,9 @@ class CompilerOracle : AllStatic {
|
||||
// For updating the oracle file
|
||||
static void append_comment_to_file(const char* message);
|
||||
static void append_exclude_to_file(methodHandle method);
|
||||
|
||||
// Tells whether there are any methods to print for print_method_statistics()
|
||||
static bool should_print_methods();
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_COMPILER_COMPILERORACLE_HPP
|
||||
|
@ -1273,6 +1273,12 @@ bool InstanceKlass::find_field_from_offset(int offset, bool is_static, fieldDesc
|
||||
|
||||
|
||||
void InstanceKlass::methods_do(void f(Method* method)) {
|
||||
// Methods aren't stable until they are loaded. This can be read outside
|
||||
// a lock through the ClassLoaderData for profiling
|
||||
if (!is_loaded()) {
|
||||
return;
|
||||
}
|
||||
|
||||
int len = methods()->length();
|
||||
for (int index = 0; index < len; index++) {
|
||||
Method* m = methods()->at(index);
|
||||
|
@ -307,9 +307,9 @@ JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
|
||||
!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 = k->size() * wordSize;
|
||||
*size_ptr = (jlong)k->size() * wordSize;
|
||||
} else {
|
||||
*size_ptr = mirror->size() * wordSize;
|
||||
*size_ptr = (jlong)mirror->size() * wordSize;
|
||||
}
|
||||
return JVMTI_ERROR_NONE;
|
||||
} /* end GetObjectSize */
|
||||
|
@ -120,7 +120,8 @@ void collect_profiled_methods(Method* m) {
|
||||
}
|
||||
|
||||
void print_method_profiling_data() {
|
||||
if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData)) {
|
||||
if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData) &&
|
||||
(PrintMethodData || CompilerOracle::should_print_methods())) {
|
||||
ResourceMark rm;
|
||||
HandleMark hm;
|
||||
collected_profiled_methods = new GrowableArray<Method*>(1024);
|
||||
|
97
hotspot/src/share/vm/runtime/sharedRuntimeMath.hpp
Normal file
97
hotspot/src/share/vm/runtime/sharedRuntimeMath.hpp
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
|
||||
#define SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
|
||||
|
||||
#include <math.h>
|
||||
|
||||
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
|
||||
// [jk] this is not 100% correct because the float word order may different
|
||||
// from the byte order (e.g. on ARM FPA)
|
||||
#ifdef VM_LITTLE_ENDIAN
|
||||
# define __HI(x) *(1+(int*)&x)
|
||||
# define __LO(x) *(int*)&x
|
||||
#else
|
||||
# define __HI(x) *(int*)&x
|
||||
# define __LO(x) *(1+(int*)&x)
|
||||
#endif
|
||||
|
||||
static double copysignA(double x, double y) {
|
||||
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
|
||||
return x;
|
||||
}
|
||||
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (c) 1998 Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* scalbn (double x, int n)
|
||||
* scalbn(x,n) returns x* 2**n computed by exponent
|
||||
* manipulation rather than by actually performing an
|
||||
* exponentiation or a multiplication.
|
||||
*/
|
||||
|
||||
static const double
|
||||
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
|
||||
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
|
||||
hugeX = 1.0e+300,
|
||||
tiny = 1.0e-300;
|
||||
|
||||
static double scalbnA (double x, int n) {
|
||||
int k,hx,lx;
|
||||
hx = __HI(x);
|
||||
lx = __LO(x);
|
||||
k = (hx&0x7ff00000)>>20; /* extract exponent */
|
||||
if (k==0) { /* 0 or subnormal x */
|
||||
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
|
||||
x *= two54;
|
||||
hx = __HI(x);
|
||||
k = ((hx&0x7ff00000)>>20) - 54;
|
||||
if (n< -50000) return tiny*x; /*underflow*/
|
||||
}
|
||||
if (k==0x7ff) return x+x; /* NaN or Inf */
|
||||
k = k+n;
|
||||
if (k > 0x7fe) return hugeX*copysignA(hugeX,x); /* overflow */
|
||||
if (k > 0) /* normal result */
|
||||
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
|
||||
if (k <= -54) {
|
||||
if (n > 50000) /* in case integer overflow in n+k */
|
||||
return hugeX*copysignA(hugeX,x); /*overflow*/
|
||||
else return tiny*copysignA(tiny,x); /*underflow*/
|
||||
}
|
||||
k += 54; /* subnormal result */
|
||||
__HI(x) = (hx&0x800fffff)|(k<<20);
|
||||
return x*twom54;
|
||||
}
|
||||
|
||||
#endif // SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2014, 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
|
||||
@ -43,78 +43,7 @@
|
||||
# pragma optimize ( "", off )
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
|
||||
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
|
||||
// [jk] this is not 100% correct because the float word order may different
|
||||
// from the byte order (e.g. on ARM)
|
||||
#ifdef VM_LITTLE_ENDIAN
|
||||
# define __HI(x) *(1+(int*)&x)
|
||||
# define __LO(x) *(int*)&x
|
||||
#else
|
||||
# define __HI(x) *(int*)&x
|
||||
# define __LO(x) *(1+(int*)&x)
|
||||
#endif
|
||||
|
||||
#if !defined(AIX)
|
||||
double copysign(double x, double y) {
|
||||
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
|
||||
return x;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (c) 1998 Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
* scalbn (double x, int n)
|
||||
* scalbn(x,n) returns x* 2**n computed by exponent
|
||||
* manipulation rather than by actually performing an
|
||||
* exponentiation or a multiplication.
|
||||
*/
|
||||
|
||||
static const double
|
||||
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
|
||||
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
|
||||
hugeX = 1.0e+300,
|
||||
tiny = 1.0e-300;
|
||||
|
||||
#if !defined(AIX)
|
||||
double scalbn (double x, int n) {
|
||||
int k,hx,lx;
|
||||
hx = __HI(x);
|
||||
lx = __LO(x);
|
||||
k = (hx&0x7ff00000)>>20; /* extract exponent */
|
||||
if (k==0) { /* 0 or subnormal x */
|
||||
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
|
||||
x *= two54;
|
||||
hx = __HI(x);
|
||||
k = ((hx&0x7ff00000)>>20) - 54;
|
||||
if (n< -50000) return tiny*x; /*underflow*/
|
||||
}
|
||||
if (k==0x7ff) return x+x; /* NaN or Inf */
|
||||
k = k+n;
|
||||
if (k > 0x7fe) return hugeX*copysign(hugeX,x); /* overflow */
|
||||
if (k > 0) /* normal result */
|
||||
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
|
||||
if (k <= -54) {
|
||||
if (n > 50000) /* in case integer overflow in n+k */
|
||||
return hugeX*copysign(hugeX,x); /*overflow*/
|
||||
else return tiny*copysign(tiny,x); /*underflow*/
|
||||
}
|
||||
k += 54; /* subnormal result */
|
||||
__HI(x) = (hx&0x800fffff)|(k<<20);
|
||||
return x*twom54;
|
||||
}
|
||||
#endif
|
||||
#include "runtime/sharedRuntimeMath.hpp"
|
||||
|
||||
/* __ieee754_log(x)
|
||||
* Return the logarithm of x
|
||||
@ -719,7 +648,7 @@ double __ieee754_pow(double x, double y) {
|
||||
z = one-(r-z);
|
||||
j = __HI(z);
|
||||
j += (n<<20);
|
||||
if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */
|
||||
if((j>>20)<=0) z = scalbnA(z,n); /* subnormal output */
|
||||
else __HI(z) += (n<<20);
|
||||
return s*z;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2014, 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
|
||||
@ -63,63 +63,7 @@
|
||||
#define SAFEBUF
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
|
||||
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
|
||||
// [jk] this is not 100% correct because the float word order may different
|
||||
// from the byte order (e.g. on ARM)
|
||||
#ifdef VM_LITTLE_ENDIAN
|
||||
# define __HI(x) *(1+(int*)&x)
|
||||
# define __LO(x) *(int*)&x
|
||||
#else
|
||||
# define __HI(x) *(int*)&x
|
||||
# define __LO(x) *(1+(int*)&x)
|
||||
#endif
|
||||
|
||||
static double copysignA(double x, double y) {
|
||||
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
|
||||
return x;
|
||||
}
|
||||
|
||||
/*
|
||||
* scalbn (double x, int n)
|
||||
* scalbn(x,n) returns x* 2**n computed by exponent
|
||||
* manipulation rather than by actually performing an
|
||||
* exponentiation or a multiplication.
|
||||
*/
|
||||
|
||||
static const double
|
||||
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
|
||||
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
|
||||
hugeX = 1.0e+300,
|
||||
tiny = 1.0e-300;
|
||||
|
||||
static double scalbnA (double x, int n) {
|
||||
int k,hx,lx;
|
||||
hx = __HI(x);
|
||||
lx = __LO(x);
|
||||
k = (hx&0x7ff00000)>>20; /* extract exponent */
|
||||
if (k==0) { /* 0 or subnormal x */
|
||||
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
|
||||
x *= two54;
|
||||
hx = __HI(x);
|
||||
k = ((hx&0x7ff00000)>>20) - 54;
|
||||
if (n< -50000) return tiny*x; /*underflow*/
|
||||
}
|
||||
if (k==0x7ff) return x+x; /* NaN or Inf */
|
||||
k = k+n;
|
||||
if (k > 0x7fe) return hugeX*copysignA(hugeX,x); /* overflow */
|
||||
if (k > 0) /* normal result */
|
||||
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
|
||||
if (k <= -54) {
|
||||
if (n > 50000) /* in case integer overflow in n+k */
|
||||
return hugeX*copysignA(hugeX,x); /*overflow*/
|
||||
else return tiny*copysignA(tiny,x); /*underflow*/
|
||||
}
|
||||
k += 54; /* subnormal result */
|
||||
__HI(x) = (hx&0x800fffff)|(k<<20);
|
||||
return x*twom54;
|
||||
}
|
||||
#include "runtime/sharedRuntimeMath.hpp"
|
||||
|
||||
/*
|
||||
* __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
|
||||
|
@ -83,6 +83,7 @@ needs_jdk = \
|
||||
runtime/RedefineObject/TestRedefineObject.java \
|
||||
runtime/XCheckJniJsig/XCheckJSig.java \
|
||||
serviceability/attach/AttachWithStalePidFile.java \
|
||||
serviceability/jvmti/8036666/GetObjectLockCount.java \
|
||||
serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java \
|
||||
serviceability/dcmd/DynLibDcmdTest.java
|
||||
|
||||
@ -134,6 +135,8 @@ needs_compact3 = \
|
||||
gc/parallelScavenge/TestDynShrinkHeap.java \
|
||||
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
|
||||
serviceability/threads/TestFalseDeadLock.java \
|
||||
serviceability/jvmti/GetObjectSizeOverflow.java \
|
||||
serviceability/jvmti/TestRedefineWithUnresolvedClass.java \
|
||||
compiler/tiered/NonTieredLevelsTest.java \
|
||||
compiler/tiered/TieredLevelsTest.java \
|
||||
compiler/intrinsics/bmi/verifycode
|
||||
|
@ -1,12 +0,0 @@
|
||||
public class T
|
||||
{
|
||||
public static boolean foo(boolean bar)
|
||||
{
|
||||
return bar;
|
||||
}
|
||||
|
||||
public static void printIt()
|
||||
{
|
||||
System.out.println("Hello");
|
||||
}
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
#include <assert.h>
|
||||
#include <jni.h>
|
||||
#include <alloca.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
union env_union
|
||||
{
|
||||
void *void_env;
|
||||
JNIEnv *jni_env;
|
||||
};
|
||||
|
||||
union env_union tmp;
|
||||
JNIEnv* env;
|
||||
JavaVM* jvm;
|
||||
JavaVMInitArgs vm_args;
|
||||
JavaVMOption options[1];
|
||||
jclass class_id;
|
||||
jmethodID method_id;
|
||||
jint result;
|
||||
|
||||
long product(unsigned long n, unsigned long m) {
|
||||
if (m == 1) {
|
||||
return n;
|
||||
} else {
|
||||
int *p = alloca(sizeof (int));
|
||||
*p = n;
|
||||
return product (n, m-1) + *p;
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
floobydust (void *p)
|
||||
{
|
||||
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
|
||||
env = tmp.jni_env;
|
||||
|
||||
class_id = (*env)->FindClass (env, "T");
|
||||
assert (class_id);
|
||||
|
||||
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
|
||||
assert (method_id);
|
||||
|
||||
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
|
||||
|
||||
(*jvm)->DetachCurrentThread(jvm);
|
||||
|
||||
printf("%ld\n", product(5000,5000));
|
||||
|
||||
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
|
||||
env = tmp.jni_env;
|
||||
|
||||
class_id = (*env)->FindClass (env, "T");
|
||||
assert (class_id);
|
||||
|
||||
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
|
||||
assert (method_id);
|
||||
|
||||
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
|
||||
|
||||
(*jvm)->DetachCurrentThread(jvm);
|
||||
|
||||
printf("%ld\n", product(5000,5000));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, const char** argv)
|
||||
{
|
||||
options[0].optionString = "-Xss320k";
|
||||
|
||||
vm_args.version = JNI_VERSION_1_2;
|
||||
vm_args.ignoreUnrecognized = JNI_TRUE;
|
||||
vm_args.options = options;
|
||||
vm_args.nOptions = 1;
|
||||
|
||||
result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
|
||||
assert (result >= 0);
|
||||
|
||||
env = tmp.jni_env;
|
||||
|
||||
floobydust (NULL);
|
||||
|
||||
pthread_t thr;
|
||||
pthread_create (&thr, NULL, floobydust, NULL);
|
||||
pthread_join (thr, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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 <assert.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
JavaVM* jvm;
|
||||
|
||||
void *
|
||||
floobydust (void *p) {
|
||||
JNIEnv *env;
|
||||
jclass class_id;
|
||||
jmethodID method_id;
|
||||
|
||||
(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
|
||||
|
||||
class_id = (*env)->FindClass (env, "DoOverflow");
|
||||
assert (class_id);
|
||||
|
||||
method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
|
||||
assert (method_id);
|
||||
|
||||
(*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
|
||||
|
||||
(*jvm)->DetachCurrentThread(jvm);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, const char** argv) {
|
||||
JavaVMOption options[1];
|
||||
options[0].optionString = (char*) "-Xss320k";
|
||||
|
||||
JavaVMInitArgs vm_args;
|
||||
vm_args.version = JNI_VERSION_1_2;
|
||||
vm_args.ignoreUnrecognized = JNI_TRUE;
|
||||
vm_args.options = options;
|
||||
vm_args.nOptions = 1;
|
||||
|
||||
JNIEnv* env;
|
||||
jint result = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
|
||||
assert(result >= 0);
|
||||
|
||||
pthread_t thr;
|
||||
pthread_create(&thr, NULL, floobydust, NULL);
|
||||
pthread_join(thr, NULL);
|
||||
|
||||
floobydust(NULL);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Copyright (c) 2013 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 testme.sh
|
||||
# @bug 8009062
|
||||
# @summary Poor performance of JNI AttachCurrentThread after fix for 7017193
|
||||
# @compile DoOverflow.java
|
||||
# @run shell testme.sh
|
||||
|
||||
set -x
|
||||
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
|
||||
|
||||
if [ "${VM_OS}" != "linux" ]
|
||||
then
|
||||
echo "Test only valid for Linux"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
gcc_cmd=`which gcc`
|
||||
if [ "x$gcc_cmd" = "x" ]; then
|
||||
echo "WARNING: gcc not found. Cannot execute test." 2>&1
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
CFLAGS="-m${VM_BITS}"
|
||||
|
||||
LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
cp ${TESTSRC}/invoke.c .
|
||||
|
||||
# Copy the result of our @compile action:
|
||||
cp ${TESTCLASSES}/DoOverflow.class .
|
||||
|
||||
echo "Architecture: ${VM_CPU}"
|
||||
echo "Compilation flag: ${CFLAGS}"
|
||||
echo "VM type: ${VM_TYPE}"
|
||||
echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}"
|
||||
|
||||
# Note pthread may not be found thus invoke creation will fail to be created.
|
||||
# Check to ensure you have a /usr/lib/libpthread.so if you don't please look
|
||||
# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation.
|
||||
|
||||
$gcc_cmd -DLINUX ${CFLAGS} -o invoke \
|
||||
-I${TESTJAVA}/include -I${TESTJAVA}/include/linux \
|
||||
-L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \
|
||||
-ljvm -lpthread invoke.c
|
||||
|
||||
./invoke
|
||||
exit $?
|
@ -30,12 +30,16 @@ public class DoOverflow {
|
||||
overflow();
|
||||
}
|
||||
|
||||
public static void printAlive() {
|
||||
System.out.println("Java thread is alive.");
|
||||
}
|
||||
|
||||
public static void printIt() {
|
||||
System.out.println("Going to overflow stack");
|
||||
try {
|
||||
new DoOverflow().overflow();
|
||||
} catch(java.lang.StackOverflowError e) {
|
||||
System.out.println("Overflow OK " + count);
|
||||
System.out.println("Test PASSED. Got StackOverflowError at " + count + " iteration");
|
||||
}
|
||||
}
|
||||
}
|
266
hotspot/test/runtime/StackGuardPages/invoke.c
Normal file
266
hotspot/test/runtime/StackGuardPages/invoke.c
Normal file
@ -0,0 +1,266 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2014, 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/* This code tests the fact that we actually remove stack guard page when calling
|
||||
* JavaThread::exit() i.e. when detaching from current thread.
|
||||
* We overflow the stack and check that we get access error because of a guard page.
|
||||
* Than we detach from vm thread and overflow stack once again. This time we shouldn't
|
||||
* get access error because stack guard page is removed
|
||||
*
|
||||
* Notice: due a complicated interaction of signal handlers, the test may crash.
|
||||
* It's OK - don't file a bug.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <jni.h>
|
||||
#include <alloca.h>
|
||||
#include <signal.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ucontext.h>
|
||||
#include <setjmp.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
JavaVM* _jvm;
|
||||
|
||||
static jmp_buf context;
|
||||
|
||||
static int _last_si_code = -1;
|
||||
static int _failures = 0;
|
||||
static int _rec_count = 0;
|
||||
static int _kp_rec_count = 0;
|
||||
|
||||
pid_t gettid() {
|
||||
return (pid_t) syscall(SYS_gettid);
|
||||
}
|
||||
|
||||
static void handler(int sig, siginfo_t *si, void *unused) {
|
||||
_last_si_code = si->si_code;
|
||||
printf("Got SIGSEGV(%d) at address: 0x%lx\n",si->si_code, (long) si->si_addr);
|
||||
longjmp(context, 1);
|
||||
}
|
||||
|
||||
void set_signal_handler() {
|
||||
static char altstack[SIGSTKSZ];
|
||||
|
||||
stack_t ss = {
|
||||
.ss_size = SIGSTKSZ,
|
||||
.ss_flags = 0,
|
||||
.ss_sp = altstack
|
||||
};
|
||||
|
||||
struct sigaction sa = {
|
||||
.sa_sigaction = handler,
|
||||
.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESETHAND
|
||||
};
|
||||
|
||||
_last_si_code = -1;
|
||||
|
||||
sigaltstack(&ss, 0);
|
||||
sigemptyset(&sa.sa_mask);
|
||||
if (sigaction(SIGSEGV, &sa, NULL) == -1) {
|
||||
fprintf(stderr, "Test ERROR. Can't set sigaction (%d)\n", errno);
|
||||
exit(7);
|
||||
}
|
||||
}
|
||||
|
||||
void *run_java_overflow (void *p) {
|
||||
JNIEnv *env;
|
||||
jclass class_id;
|
||||
jmethodID method_id;
|
||||
int res;
|
||||
|
||||
res = (*_jvm)->AttachCurrentThread(_jvm, (void**)&env, NULL);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
class_id = (*env)->FindClass (env, "DoOverflow");
|
||||
if (class_id == NULL) {
|
||||
fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
|
||||
if (method_id == NULL) {
|
||||
fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printIt\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
(*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
|
||||
|
||||
res = (*_jvm)->DetachCurrentThread(_jvm);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
|
||||
exit(7);
|
||||
}
|
||||
}
|
||||
|
||||
void do_overflow(){
|
||||
int *p = alloca(sizeof(int));
|
||||
if (_kp_rec_count == 0 || _rec_count < _kp_rec_count) {
|
||||
_rec_count ++;
|
||||
do_overflow();
|
||||
}
|
||||
}
|
||||
|
||||
void *run_native_overflow(void *p) {
|
||||
// Test that stack guard page is correctly set for initial and non initial thread
|
||||
// and correctly removed for the initial thread
|
||||
JNIEnv *env;
|
||||
jclass class_id;
|
||||
jmethodID method_id;
|
||||
int res;
|
||||
|
||||
printf("run_native_overflow %ld\n", (long) gettid());
|
||||
|
||||
res = (*_jvm)->AttachCurrentThread(_jvm, (void **)&env, NULL);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
class_id = (*env)->FindClass (env, "DoOverflow");
|
||||
if (class_id == NULL) {
|
||||
fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
method_id = (*env)->GetStaticMethodID (env, class_id, "printAlive", "()V");
|
||||
if (method_id == NULL) {
|
||||
fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printAlive\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
|
||||
|
||||
set_signal_handler();
|
||||
if (! setjmp(context)) {
|
||||
do_overflow();
|
||||
}
|
||||
|
||||
if (_last_si_code == SEGV_ACCERR) {
|
||||
printf("Test PASSED. Got access violation accessing guard page at %d\n", _rec_count);
|
||||
}
|
||||
|
||||
res = (*_jvm)->DetachCurrentThread(_jvm);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
if (getpid() != gettid()) {
|
||||
// For non-initial thread we don't unmap the region but call os::uncommit_memory and keep PROT_NONE
|
||||
// so if host has enough swap space we will get the same SEGV with code SEGV_ACCERR(2) trying
|
||||
// to access it as if the guard page is present.
|
||||
// We have no way to check this, so bail out, marking test as succeeded
|
||||
printf("Test PASSED. Not initial thread\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Limit depth of recursion for second run. It can't exceed one for first run.
|
||||
_kp_rec_count = _rec_count;
|
||||
_rec_count = 0;
|
||||
|
||||
set_signal_handler();
|
||||
if (! setjmp(context)) {
|
||||
do_overflow();
|
||||
}
|
||||
|
||||
if (_last_si_code == SEGV_ACCERR) {
|
||||
++ _failures;
|
||||
fprintf(stderr,"Test FAILED. Stack guard page is still there at %d\n", _rec_count);
|
||||
} else if (_last_si_code == -1) {
|
||||
printf("Test PASSED. No stack guard page is present. Maximum recursion level reached at %d\n", _rec_count);
|
||||
}
|
||||
else{
|
||||
printf("Test PASSED. No stack guard page is present. SIGSEGV(%d) at %d\n", _last_si_code, _rec_count);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void usage() {
|
||||
fprintf(stderr, "Usage: invoke test_java_overflow\n");
|
||||
fprintf(stderr, " invoke test_native_overflow\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, const char** argv) {
|
||||
JavaVMInitArgs vm_args;
|
||||
JavaVMOption options[2];
|
||||
JNIEnv* env;
|
||||
|
||||
printf("Test started with pid: %ld\n", (long) getpid());
|
||||
|
||||
options[0].optionString = "-Xint";
|
||||
options[1].optionString = "-Xss320k";
|
||||
|
||||
vm_args.version = JNI_VERSION_1_2;
|
||||
vm_args.ignoreUnrecognized = JNI_TRUE;
|
||||
vm_args.options = options;
|
||||
vm_args.nOptions = 2;
|
||||
|
||||
if (JNI_CreateJavaVM (&_jvm, (void **)&env, &vm_args) < 0 ) {
|
||||
fprintf(stderr, "Test ERROR. Can't create JavaVM\n");
|
||||
exit(7);
|
||||
}
|
||||
|
||||
pthread_t thr;
|
||||
|
||||
if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) {
|
||||
printf("\nTesting JAVA_OVERFLOW\n");
|
||||
|
||||
printf("Testing stack guard page behaviour for other thread\n");
|
||||
pthread_create (&thr, NULL, run_java_overflow, NULL);
|
||||
pthread_join (thr, NULL);
|
||||
|
||||
printf("Testing stack guard page behaviour for initial thread\n");
|
||||
run_java_overflow(NULL);
|
||||
// This test crash on error
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (argc > 1 && strcmp(argv[1], "test_native_overflow") == 0) {
|
||||
printf("\nTesting NATIVE_OVERFLOW\n");
|
||||
|
||||
printf("Testing stack guard page behaviour for other thread\n");
|
||||
pthread_create (&thr, NULL, run_native_overflow, NULL);
|
||||
pthread_join (thr, NULL);
|
||||
|
||||
printf("Testing stack guard page behaviour for initial thread\n");
|
||||
run_native_overflow(NULL);
|
||||
|
||||
exit((_failures > 0) ? 1 : 0);
|
||||
}
|
||||
|
||||
fprintf(stderr, "Test ERROR. Unknown parameter %s\n", ((argc > 1) ? argv[1] : "none"));
|
||||
usage();
|
||||
}
|
@ -1,13 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
##
|
||||
## @test Test6929067.sh
|
||||
## @bug 6929067
|
||||
## @bug 8021296
|
||||
## @bug 8025519
|
||||
## @summary Stack guard pages should be removed when thread is detached
|
||||
## @run shell Test6929067.sh
|
||||
##
|
||||
#
|
||||
# @test testme.sh
|
||||
# @summary Stack guard pages should be installed correctly and removed when thread is detached
|
||||
# @run shell testme.sh
|
||||
#
|
||||
|
||||
if [ "${TESTSRC}" = "" ]
|
||||
then
|
||||
@ -32,12 +29,9 @@ fi
|
||||
|
||||
CFLAGS=-m${VM_BITS}
|
||||
|
||||
LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
|
||||
LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
cp ${TESTSRC}/*.java ${THIS_DIR}
|
||||
${COMPILEJAVA}/bin/javac *.java
|
||||
|
||||
echo "Architecture: ${VM_CPU}"
|
||||
echo "Compilation flag: ${CFLAGS}"
|
||||
echo "VM type: ${VM_TYPE}"
|
||||
@ -47,10 +41,20 @@ echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}"
|
||||
# Check to ensure you have a /usr/lib/libpthread.so if you don't please look
|
||||
# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation.
|
||||
|
||||
$gcc_cmd -DLINUX ${CFLAGS} -o invoke \
|
||||
cp ${TESTSRC}/DoOverflow.java .
|
||||
${COMPILEJAVA}/bin/javac DoOverflow.java
|
||||
|
||||
$gcc_cmd -DLINUX -g3 ${CFLAGS} -o invoke \
|
||||
-I${TESTJAVA}/include -I${TESTJAVA}/include/linux \
|
||||
-L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \
|
||||
-L${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE} \
|
||||
${TESTSRC}/invoke.c -ljvm -lpthread
|
||||
|
||||
./invoke
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Compile failed, Ignoring failed compilation and forcing the test to pass"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
./invoke test_java_overflow
|
||||
./invoke test_native_overflow
|
||||
exit $?
|
64
hotspot/test/serviceability/jvmti/GetObjectSizeOverflow.java
Normal file
64
hotspot/test/serviceability/jvmti/GetObjectSizeOverflow.java
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2014 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 com.oracle.java.testlibrary.*;
|
||||
|
||||
/*
|
||||
* Test to verify GetObjectSize does not overflow on a 600M element int[]
|
||||
*
|
||||
* @test
|
||||
* @bug 8027230
|
||||
* @library /testlibrary
|
||||
* @build GetObjectSizeOverflowAgent
|
||||
* @run main ClassFileInstaller GetObjectSizeOverflowAgent
|
||||
* @run main GetObjectSizeOverflow
|
||||
*/
|
||||
public class GetObjectSizeOverflow {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
if (!Platform.is64bit()) {
|
||||
System.out.println("Test needs a 4GB heap and can only be run as a 64bit process, skipping.");
|
||||
return;
|
||||
}
|
||||
|
||||
PrintWriter pw = new PrintWriter("MANIFEST.MF");
|
||||
pw.println("Premain-Class: GetObjectSizeOverflowAgent");
|
||||
pw.close();
|
||||
|
||||
ProcessBuilder pb = new ProcessBuilder();
|
||||
pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", "agent.jar", "GetObjectSizeOverflowAgent.class"});
|
||||
pb.start().waitFor();
|
||||
|
||||
ProcessBuilder pt = ProcessTools.createJavaProcessBuilder(true, "-Xmx4000m", "-javaagent:agent.jar", "GetObjectSizeOverflowAgent");
|
||||
OutputAnalyzer output = new OutputAnalyzer(pt.start());
|
||||
|
||||
if (output.getStdout().contains("Could not reserve enough space") || output.getStderr().contains("java.lang.OutOfMemoryError")) {
|
||||
System.out.println("stdout: " + output.getStdout());
|
||||
System.out.println("stderr: " + output.getStderr());
|
||||
System.out.println("Test could not reserve or allocate enough space, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
output.stdoutShouldContain("GetObjectSizeOverflow passed");
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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 GetObjectSizeOverflowAgent {
|
||||
|
||||
static Instrumentation instrumentation;
|
||||
|
||||
public static void premain(String agentArgs, Instrumentation instrumentation) {
|
||||
GetObjectSizeOverflowAgent.instrumentation = instrumentation;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int[] a = new int[600_000_000];
|
||||
long size = instrumentation.getObjectSize(a);
|
||||
|
||||
if (size < 2_400_000_000L) {
|
||||
throw new RuntimeException("Invalid size of array, expected >= 2400000000, got " + size);
|
||||
}
|
||||
|
||||
System.out.println("GetObjectSizeOverflow passed");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user