Spezielle (interne) JDK Methode um Objektgröße zu ermitteln

Thomas Darimont

Erfahrenes Mitglied
Hallo!

War mal wieder ein wenig am experimentieren und hab ne nette Methode im Interface
java.lang.instrument.Instrumentation ausgemacht (long getObjectSize(Object o) )
die laut API Doc:
getObjectSize
long getObjectSize(Object objectToSize)Returns an implementation-specific approximation of the amount of storage consumed by the specified object. The result may include some or all of the object's overhead, and thus is useful for comparison within an implementation but not between implementations. The estimate may change during a single invocation of the JVM.

Parameters:
objectToSize - the object to size
Returns:
an implementation-specific approximation of the amount of storage consumed by the specified object
Throws:
NullPointerException - if the supplied Object is null.

die Betriebssystemabhänige Größe des übergeben Objekts ermitteln kann. Leider gibt es nur eine Implementierung dieses Interfaces in einer sun Klasse. Genauer gesagt:
sun.instrument.InstrumentationImpl

Deren Kosntruktur ist private weshalb wir auf Reflection zurückgreifen müssen...

Die instrument.dll findet man im %JAVA_HOME%/jre/lib Verzeichnis.
Code:
/*
 * Created on 17.02.2005@22:48:40
 *
 * TODO Licence info
 */
package de.tutorials;

import java.lang.instrument.Instrumentation;
import java.lang.reflect.Constructor;

import sun.instrument.InstrumentationImpl;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class ObjectSizeEstimator {

    static {
        System.loadLibrary("instrument");
    }

    public static void main(String[] args) throws Exception {

        Constructor ctor = InstrumentationImpl.class
                .getDeclaredConstructor(new Class[] { long.class, boolean.class });
        ctor.setAccessible(true);

        Instrumentation inst = (Instrumentation) ctor.newInstance(new Object[] {
                Long.valueOf(0L), Boolean.TRUE });

        System.out.println(inst.getObjectSize(new Object()));

    }
}

Bekomme hierbei leider den folgenden Fehler:
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: getObjectSize0
	at sun.instrument.InstrumentationImpl.getObjectSize0(Native Method)
	at sun.instrument.InstrumentationImpl.getObjectSize(InstrumentationImpl.java:97)
	at de.tutorials.ObjectSizeEstimator.main(ObjectSizeEstimator.java:33)

Jemand eine Idee? (Die dll wird auf jeden Fall gefunden) Hab schon mit dem Dependency Walker drüber geschaut und nur Abhänigkeiten von kernel32.dll und msvcrt.dll ausmachen können.

Edit: Aktuelleres Beispiel gibts hier:
http://www.tutorials.de/forum/java/...lung-platformspezifischer-objektgroessen.html

Gruß Tom
 
Zurück