OFF (de tényleg off) Re: [BSD] Java sok memóriát zabál?
Auth Gábor
auth.gabor at javaforum.hu
2007. Jan. 18., Cs, 21:14:11 CET
Halihó!
2007. január 18. 20.25 dátummal Laszlo Nagy ezt írta:
>> Kb. egy másodperc ez az overhead.
> Van ahol ez lassúnak számít. Ez az ami miatt pl. soha nem írnék unix-os
> parancsként használható programot Java-ban.
Más módszerrel kell írni mindössze... a lényeg, hogy ne új JVM induljon,
hanem egy meglévőhöz tudd kapcsolni. Simán megoldható, hogy egy Java démonnak
továbbítod local socketen a pipe-ot.
> Vannak programok amiket nem arra terveztek hogy sokszor el legyenek
> indítva. Vannak olyanok amiket igen. Ez nem feltétlenül egy "hiba"; de
> mindenképp korlátnak számít.
Azokat úgy kell megvalósítani... de nem teljesen logikus az, hogy két
egyszer lefuttatott programon nézzük a futásidőket. Ha többször kell
futtatni, akkor a HotSpot jelentősen gyorsít a Java program futásán (egy
átlag C++ programhoz képes akár 200-300% fölé is). De ehhez így kell megírni.
> Érdekelne, hogy ez melyik rendszerhívás? Biztos nem mmap(2), mert az
> csak adatnak foglal le címterületet; itt meg kódnak kell címet foglalni.
> Illetve Java esetén lehet hogy ez adatnak számít mert a JVM futtatja és
> nem az oprendszer, de kíváncsi lennék hogy egy C-ben írt natív ELF
> bináris mit hív meg hogy ez lehetséges legyen. DLL-t vagy .so filet
> tudom hogy kell betölteni, de ott szerintem először tényleg betölti a
> memóriába, és később swappeli ha kell. Szóval melyik az a sok program
> ami ezt csinálja? Van-e közöttük natív? Ha igen akkor hogyan csinálja?
Részlet a top-ból. A gépben van 1G memória, a Java, ami egy Tomcat
ténylegesen azt a 132MBájtot eszi, a többi (1.2GBájt) az be se töltött lib:
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
30351 www 25 20 0 1335M 132M kserel 0 3:53 0.05% java
Itt pedig az önbevallása az elindulásról:
INFO: Initialization processed in 1837 ms
El tudod képzelni, hogy olyan csúcs-szuper gépem van, hogy majd 1.4GBájt
adatot betölt a háttértárról, majd ki is teszi swap-re két másodperc alatt?
Attól, hogy behúzol egy libet, az még nem kerül be a rezidens (RES)
memóriába, az oprendszer csak megjelöli, mint lemezen lévő inaktív page. Ha
be kell húzni, akkor megvan a fizikai címe (nem kell kotorászni a
fájlrendszeren), és akkor tölti csak be... ez nagyon jó módszer, csak
csalóka, mert azt hiszed, hogy behúzott 1.4G programkódot és adatot, pedig
valóságban a tized részét se.
--
http://www.javaforum.hu -=- http://www.enaplo.hu
Auth Gábor -=- FreeBSD 5.4 -=- http://bsd.lap.hu
http://www.javaforum.hu/web/authgabor/
További információk a(z) BSD levelezőlistáról