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