Java 2 Útikalauz programozóknak 5.0

Az elte.java2_utikalauz5.memoria csomag

A Memóriakezelés fejezet példaprogramjai.

Tovább lásd:
          részletes leírás

package elte.java2_utikalauz5.memoria

A Memóriakezelés fejezet példaprogramjai.

A Java nyelv és környezet tervezésekor az egyik szempont az volt, hogy a szintaxis minél ismerősebb legyen a (széles körben elterjedt és kedvelt) C és C++ nyelvek ismerői számára. (A C és C++ mellett az Eiffel, a SmallTalk, az Objective C és a Cedar/Mesa nyelvek is például szolgáltak.) Ugyanakkor kimaradtak a Java környezetbe nem illeszkedő, valamint a Java céljaira túl bonyolultnak, feleslegesnek, mással helyettesíthetőnek vagy nem eléggé biztonságosnak ítélt nyelvi elemek. A tervezők céljai között szerepelt, hogy a Java erősen típusos és biztonságos legyen, ugyanakkor rendelkezzék az interpretált, gyengén típusos nyelvek (mint például a UNIX-parancsértelmezők, awk stb.) előnyével, a gyors prototipizálhatósággal. Célkitűzés volt az is, hogy definit és platformfüggetlen legyen egy program viselkedése, az esetleges hibák fordításkor, betöltéskor, futtatáskor minél hamarabb kiderüljenek, és a fellépésükkor inkább azonnal váltsanak ki kivételt, mint hogy egy későbbi ponton definiálatlan, hibás, nehezen kideríthető okú viselkedést vonjanak maguk után. Ennek érdekében egyfelől számos ponton szűkítették a nyelv és környezet lehetőségeit a C, C++ (és egyéb vas-közeli) nyelvekhez képest, másfelől azonban ezáltal \ai dús'' hibaforrásokat iktattak ki. Emiatt a C, C++ nyelvek természetes összehasonlítási alapként kínálkoznak a Java nyelv memóriakezelésének ismertetésekor, már csak azért is, mert néha eltérő jellegű implementáció van a hasonló szintaxis mögött is. Minthogy a memóriamodellt, a memóriakezelést nagy mértékben a biztonságosság szempontjaira való tekintettel alakították ki, a fejezetben néhány, a biztonsággal kapcsolatos kérdést is érintünk. A fejezet első részében a Java nyelv memóriakezeléséről általában esik szó, majd a végén a Java 2 platform e téren bevezetett újdonságairól, a gyenge hivatkozásokról és a referencia-objektumokról.
Tartalomjegyzék a hivatkozott referenciákkal és felhasznált képekkel:
A memóriakezelési és -hivatkozási modell
Típuskényszerítések és az instanceof
A class-fájlok betöltéskori ellenőrzéséről
public class j1 {
    final static int READ=1;
    final static int WRITE=2;
    int flag;
    public j1 ( int flag) {
        this.flag=flag;
    }
    public void doit() {
        System.out.println((flag==READ) ? "READ" : "WRITE");
    }
}
public class j2 {
    public static void main (String argv[]) {
        int flag=j1.READ;
        System.out.println((flag==j1.READ) ? "READ" : "WRITE");
        new j1(flag).doit();
    }
}
Tömbök
public class foo {
    public static void teszteld(int i,Object o1,Object o2) {
        System.out.println(i + ". " + (o1==o2) + " " + o1.equals(o2));
    }
    public static void main(String arg[])     {
    Object o1[]={"",new String(""),new Integer(0),new byte[0]};
    Object o2[]={"",new String(""),new Integer(0),new byte[0]};
        for(int i=0;i
Paraméterátadás metódushíváskor
    void foo(int i,String s) {
        s=String.valueOf(++i);
    }
    void bar() {
        int i=0; String s=String.valueOf(i);
        foo(i,s);
        System.out.println(i + "=" + s);
    }

    String foo(int i) {
        return String.valueOf(++i);
    }
    void bar() {
        int i=0; String s=foo(i);
        System.out.println(i + "=" + s);
    }

    void foo(int e[]) {
        for(int i=1;i
    Object[] foo(int i) {
        i++;
        Object [] o=new Object [2];
        o[0]=new Integer(i);
        o[1]=String.valueOf(i);
        return o;
    }

    void bar() {
        int i=0;
        Object o[]=foo(i);
//      i=((Integer)(o[0])).intValue();  // autoboxing nélkül
        i=(Integer)o[0];         // autoboxing-gal
        String s=(String)o[1];
        System.out.println(i + "=" + s);
    }
A void * és a függvénymutatók
Erős elérhetőség és a szemétgyűjtő mechanizmus
import java.util.*;
class MemoryLeakage {
  static Collection history=new ArrayList();
  public MemoryLeakage () {
    history.add(this);
  }
}

public class a {
        public static void main(String args[]) {
                while(true) Thread t=new Thread();
        }
}
Gyenge hivatkozások és referencia-objektumok
    SoftReference  sr = null;
    // ...
    Image image = (sr == null) ? null : sr.get();
    if (image == null) {
        image = getImage() ;
        sr = new SoftReference (image);
    }
A java.lang.ref csomag nyilvános osztályai
Értesítés
A ReferenceQueue osztály metódusai
A Reference osztály metódusai
A gyenge referencia háromféle erőssége
A java.util.WeakHashMap osztály
import java.util.*;
public class memt {
    public static void main(String argv[]) {
        WeakHashMap map=new WeakHashMap();
        for(int i=1;;i++) {
            map.put(new byte[i],String.valueOf(i));
            int j=map.size();
            System.out.println(i + " " + j) ;
            if (i != j) break;
        }
    }
}
A virtuális gép memóriafelhasználása

Szerző:
Balázs Iván József
Forrásfájl:
package-info.java

Java 2 Útikalauz programozóknak 5.0