|
Duplicate :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
Latest patch for the lambda form caching feature in 8u40 (JDK-8046703) causes an OutOfMemoryError.
Patch link: http://cr.openjdk.java.net/~vlivanov/lfc/2014-07-16
JDK WS patched: http://hg.openjdk.java.net/jdk9/dev/jdk
Sequential creation of method handles garbage causes OOME in patched jdk. NO OOME happens in original JDK 9 b27.
Here is the code to check for OOME (run it with limited heap, e.g. -Xmx10m):
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
*
* @author kshefov
*/
public class LFCOOMTest {
static Random RNG = new Random();
static final MethodHandles.Lookup lookup = MethodHandles.lookup();
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws
ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
int arity;
MethodType mt;
MethodHandle mh;
while (true) {
arity = RNG.nextInt(127);
mt = randomMethodTypeGenerator(arity);
mh = methodHandleGenerator(mt.returnType(),
mt.parameterList());
}
}
private static MethodHandle methodHandleGenerator(Class<?>
returnType, List<Class<?>> argTypes) throws NoSuchMethodException,
IllegalAccessException {
MethodHandle result;
Class<?> clazz = Class1.class;
String returnTypeStr = returnType.getSimpleName();
result = lookup.findStatic(clazz, "return" + returnTypeStr,
MethodType.methodType(returnType));
return MethodHandles.dropArguments(result, 0, argTypes);
}
private static MethodType randomMethodTypeGenerator(int arity) {
List<Class<?>> list = new ArrayList<>(arity);
Class<?> argType;
for (int i = 0; i < arity; i++) {
argType = classes[RNG.nextInt(classes.length - 1)];
list.add(argType);
}
Class<?> rtype = classes[RNG.nextInt(classes.length)];
return MethodType.methodType(rtype, list);
}
private static final Class<?> classes[] = {
Object.class,
int.class,
boolean.class,
byte.class,
short.class,
char.class,
long.class,
float.class,
double.class,
void.class
};
private static class Class1 {
static Object returnObject() {
return 1;
}
static int returnint() {
return 1;
}
static char returnchar() {
return 1;
}
static boolean returnboolean() {
return true;
}
static byte returnbyte() {
return 1;
}
static short returnshort() {
return 1;
}
static long returnlong() {
return 1;
}
static float returnfloat() {
return 1;
}
static double returndouble() {
return 1;
}
static void returnvoid() {
}
}
}
|