Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein Beispiel wie man in Java Buffer erzeugen kann,
die Integer.MAX_VALUE Elemente enthalten können.
In einem Java Programm führt der folgende Code:
zu diesem Fehler:
... mit etwas Trickserei und sun.misc.Unsafe kann man jedoch auch Buffer kreieren, die Integer.MAX_VALUE groß sind
- Solche Hacks bitte niemals in Produktionscode einsetzen... ;-)
Ausgabe:
Gruß Tom
hier mal ein Beispiel wie man in Java Buffer erzeugen kann,
die Integer.MAX_VALUE Elemente enthalten können.
In einem Java Programm führt der folgende Code:
Java:
byte[] buffer = new byte[Integer.MAX_VALUE];
System.out.println(buffer);
zu diesem Fehler:
Code:
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at de.tutorials.BigBufferAllocationExample.main(BigBufferAllocationExample.java:6)
... mit etwas Trickserei und sun.misc.Unsafe kann man jedoch auch Buffer kreieren, die Integer.MAX_VALUE groß sind

Java:
package de.tutorials.training;
import java.lang.reflect.Field;
enum UNSAFE {
INSTANCE;
private sun.misc.Unsafe unsafe;
private UNSAFE(){
try {
Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
this.unsafe = (sun.misc.Unsafe)unsafeField.get(null);
} catch (Exception e) {
e.printStackTrace();
}
}
static sun.misc.Unsafe get() {
return INSTANCE.unsafe;
}
}
public class BigBufferAllocationExample {
public static void main(String[] args) {
// byte[] buffer = new byte[Integer.MAX_VALUE];
// System.out.println(buffer);
long counter = 0L;
long ptr = UNSAFE.get().allocateMemory(Integer.MAX_VALUE);
for(int i = 0; i< Integer.MAX_VALUE;i++){
UNSAFE.get().putByte(ptr+i, (byte)2);
counter++;
}
System.out.println(counter);
long sum = 0L;
for(int i = 0; i< Integer.MAX_VALUE;i++){
sum += UNSAFE.get().getByte(ptr+i);
}
System.out.println(sum);
UNSAFE.get().freeMemory(ptr);
}
}
Ausgabe:
Code:
2147483647
4294967294
Gruß Tom