JAVA Carbige Collector

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
zegee29
Nový používateľ
Nový používateľ
Príspevky: 32
Dátum registrácie: Pi 31. Aug, 2007, 08:00

JAVA Carbige Collector

Príspevok od používateľa zegee29 »

Caute, chcel by som vyriesit jeden problem, a to ze java program dost spomaluje chod pocitaca, teda nie hned ale chcem robit taky co bude zapnuty pocas celeho behu PC a po par hodinach zacne nehorazne sekat. neviete poradit? ako na to? nejaka finta alebo co nastudovat, dakujem....
Používateľov profilový obrázok
galen
Používateľ
Používateľ
Príspevky: 2237
Dátum registrácie: Št 01. Jún, 2006, 02:00
Bydlisko: Zilina

Re: JAVA Carbige Collector

Príspevok od používateľa galen »

zegee29 napísal:Caute, chcel by som vyriesit jeden problem, a to ze java program dost spomaluje chod pocitaca, teda nie hned ale chcem robit taky co bude zapnuty pocas celeho behu PC a po par hodinach zacne nehorazne sekat. neviete poradit? ako na to? nejaka finta alebo co nastudovat, dakujem....
nejake info o programe?

vytvaras si tam objekty, stale ich drzis, neodmazavas ich zo struktur, a potom to naboptna, az si JVM zavola GC pre vycistenie pamate, pride na to, ze nema co cistit, lebo vsetko je pouzivane, a tak funguje trosku dalej, potom znova zavola GC aby prisla na to ze nema co vycistit, a takto sa ti cykli dookola, az do doby, ze dripsne na out of memory ?

alebo aky je problem vlastne ?

PS: garbage collector zavolas System.gc();, ale ak to mas nahovno napisane (program), tak ti to nepomoze
PPS: mne bezi watchdog na jave, ktory vsehovsudy nic nerobi, ale alokuje dealokuje datove struktury, posiela o tom spravy a loguje... a zatial vzdy ustal cely chod systemu (chap uptime >20 dni) *a GarbageCollector tam nevolam*
lava, prava, lava, prava ...
Používateľov profilový obrázok
kami_sama
Používateľ
Používateľ
Príspevky: 362
Dátum registrácie: Po 05. Sep, 2005, 20:00
Bydlisko: Bratislava

Re: JAVA Carbige Collector

Príspevok od používateľa kami_sama »

na pps-> ani nemusis volat garbage collector. je to vo vacsine pripadov je to zbytocne.

co sa tyka problemu...

nie je problem v zle navrhnutom programe? resp. tiez si viem predstavit, ze kod ti nebezi stale a niektore veci ti OS da do strankovacieho suboru, co moze mat za nasledok sekanie programu...
Používateľov profilový obrázok
zegee29
Nový používateľ
Nový používateľ
Príspevky: 32
Dátum registrácie: Pi 31. Aug, 2007, 08:00

Re: JAVA Carbige Collector

Príspevok od používateľa zegee29 »

tak moj prgram spociva v tom, ze sa spusti a najde na stranke urcity string. ak je iny ako ma zaznamenany v subore, vyhlasi JMessageBox ze nasiel novy string (stranka sa uploadovala). potom sa na 20 minut zastavi, caka... (sleep) a odznova...
Ked tak premyslam nad vasimi prispevkami, moze byt ze napriklad
int i=0;
for (i=0;i<m.length();i++)...
zeberie menej pamate ako
for (int i=0;i<m.length();i++)...
na hladanie stringu som nepouzil regularne vyrazy, jednoduche String.indexOf() prikazy a lastIndexOf() a pod.
Len tak sa spytam, lebo nie som velky javysta, v C sme pouzivali dealloc a podobne "uvolnovanie" pamate. existuje aj v jave take nieco?
Este doplnim, mozna to zmeni nadlhad na problematiku, neseka mi iba program ale cely pocitac, teda hlavne tie programy co pouzivaju javu (Mozilla, a podobne), ale ani ine vecicky na tom nie su lepsie (Explorer-systemovy)...
Používateľov profilový obrázok
galen
Používateľ
Používateľ
Príspevky: 2237
Dátum registrácie: Št 01. Jún, 2006, 02:00
Bydlisko: Zilina

Re: JAVA Carbige Collector

Príspevok od používateľa galen »

ad sekanie:
vsetku javu ti handluje JVM (virtual machine), vratane pamati. Ta ma v settingoch, kolko pamate moze celkovo pouzivat (pre vsetky javoidne programky), akonahle ju zacnes pouzivat na hrane limitov, zacne mat priliz vela overheadu s vyprazdnovanim.
v tom najhorsom pripade nerobi nic ine, nez sa snazi vyprazdnit ... a zabera to 95% jej pracovnej doby ... a vyhuli to vsetko, co je previazane s javou...

co sa tyka garbage collectoru, pokial zabera "cistenie" pamate velke % chodu, odporuca sa bud zvatsit memory usage, pre JVM (pod woknami najdes tusim v "premmennych prostredia", pripadne to vies naforcovat pri spustani jar suboru, cez parametre)

ad prehladavanie:
int i;
for(i=0;i<cosi.length;i++) {...
ti zabera tolko isto pamate ako:
for (int i = 0; i < array.length; i++) {...

ale moznost spodna, po ukonceni FOR, nedrzi obsah premennej i -> moze ju GC odstranit

najradsej vsak pouzivam foreach, neriesim ako funguje, nepotrebujes zistovat dlzky poli ani nic podobne, nejak to robi java (a ja intuitivne predpokladam, ze to robi efektivnejsie, ako by som si to ja naprogramoval) a vysledok dostanem...


Co sa tyka tvojho programku tak, ak som spravne pochopil:
Vezmes TEXT (browser, subor, cokolvek),
ten rozparsujes na slova.
Nad kazdym slovom volas: vezmi slovo, a zisti, ci je v nejakej strukture. Ak tam nieje, pridaj ho tam. Ak tam je vykonaj operaciu (counter++ alebo cokolvek ine).
Nasledne programek urobi sleep ...
a pokracuje od "vezmes text (browser...)"

Mozne problemy:
skontroluj si parsovanie slov, mozno nieje az take dobre, a nasobis tam data, takze namiesto textu, ktory mal povodne 5kB a 1000 slov, ty urobis 2-3 tisice zaznamov, mozno o velkosti 10+ kB.
davas to do statickej struktury, teda pole (list), s fixnym poctom prvkov (toto dufam nieje pravda, a modlim sa, aby to tak nebolo), skus pozriet nieco ako arraylist, treelist, hashmap a podobne.. pripadne si precitat o implementaciach datovych struktur, aby si prisiel na to, ktora by mohla byt najefektivnejsia
vyhladavanie nad celym polom bude podla mna dalsi mozny zahrdel, ak nepouzivas rozumne vyhladavanie, mas zlozitost O(n)
pouvazovat nad usporiadanym zoznamom slov, pripadne hashmapou, alebo niecim ... mohlo/malo by to urychlit


tolko problemy, ktore ma tak narychlo napadly, bez toho, aby som tusil, ako to je spravene... na viac by trebalo ci uz zdrojaky, alebo aspon schemu co tam pouzivas a tak nejak co s tym robis
lava, prava, lava, prava ...
Používateľov profilový obrázok
zegee29
Nový používateľ
Nový používateľ
Príspevky: 32
Dátum registrácie: Pi 31. Aug, 2007, 08:00

Re: JAVA Carbige Collector

Príspevok od používateľa zegee29 »

To galen:
Nad tym VJM som nepremyslal, som myslel ze to ma riesene, ale pozrem sa aj na to. v podstate si takmer presne odhadol co bude progmram robit, ale moj postup parsovania je, ze pojde na stranku, stiahne jej zdrojak a tam si najde dany string. Vsak nepouzil som regularne vyrazy, jednak ze v tom nie som odbornik a skusal som a robi mi to hluposti. jednoducho som si nasiel pomocou IndexOf("Digi") polohu a potom prvy </table> od toho, posledny <table> predtym a tento "table" interval som spracoval pomocou substringu na krasny zdrojak tabulky s hodnotami, ktoru zobrazit cez JLabel uz nie je problem.
Matcher, teda regularne vyrazy som nespravil, lebo hladal som pomocou stringu <table.+Digi.+</table>, co chapem ze mi vseliako spracuje, ale necakal som ze mi to vyhodi len jeden jediny vyraz, kde su styri tabulky (medzi nimi moja hladana) vnorene este do jednej vacsej.
Používateľov profilový obrázok
galen
Používateľ
Používateľ
Príspevky: 2237
Dátum registrácie: Št 01. Jún, 2006, 02:00
Bydlisko: Zilina

Re: JAVA Carbige Collector

Príspevok od používateľa galen »

nuz, tak potom hladaj, kde este drzis odkazy na zbytocne objekty, ktore ti netreba ku beznemu zivotu

najistejsie mas, pokazde, ked nechces objekt, setnut premennu na null

akonahle ho davas do datovych struktur ako su zoznamy, tak ti nepomoze iba premennu setnut na null, ale treba ho aj z tej datovej struktury odstranit
(zalezi od implementacie/pouzitej struktury, ale hladaj nieco ako remove, purge)

pripadne ak sa chces zbavit celej datovej struktury, setni ju na null ...

tym povies JVMku, ze tie data uz nechces, a pri najblizsom spustani GCcka, to posle prec ...


Tu sa naozaj dostavame k ukazkovemu vynuteniu volania GC, a to:
pracujem s velkym objemom dat, a som v casovej tiesni (nechcem omedzovat uzivatela)
1) vyalokujem vsetko co potrebujem
2) spravim si svoje drobnosti
3) zahodim vsetko co nepotrebujem (setnem premenne na null, precistim kolekcie a podobne)
4) zavolam GC

tym ze zavolas GC sa vyhnes tomu, aby v casovej tiesni (body 1-2) sa ti nahodou nezacal volat GC, a tak nespomaloval...

PS: pripadne sa poobzeraj po parseroch na XML, tie by ti vedeli vyhladat priamo tabulky, a potom by si teoreticky k tomu vedel pristupovat ako k stromovym objektom... a nemusel to parsovat rucne ...
lava, prava, lava, prava ...

Návrat na "Programovanie"