Spielerei ... new byte[Integer.MAX_VALUE]

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:
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 :) - Solche Hacks bitte niemals in Produktionscode einsetzen... ;-)


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
 
Zurück