Zdarec, nasel by se tu nekdo, kdo ma zkusenosti s VisualVM a profilovanim javy? neni mi jasna jedna vec. Mam program:
public class Main {
public static void main(String[] args) {
Runnable action = () -> {
while (true) {
System.out.println("memory ate");
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e) {
//nothing
}
}
};
new Thread(action, "Eater").start();
}
}
Kdyz se na tento program podivam ve VisualVM tak vidim, ze vlakno "Eater" spotrebovava vic a vic pameti. Muzete mi nekdo vysvetlit proc?
(http://i.imgur.com/vgr9lBJ.jpg)
Diky za pomoc:)
Ta pamet tam zustava i po zavolani GC? (ve VisualVM na to mas tlacitko)
prave ze jo, furt to vypada, ze to roste
A co jsou zac ty objekty, co je GC nesezere?
Zkuste prodloužit dobu čekání, možná to čeká na výstup do terminálu.
Citace od: Ondra Satai Nekola kdy 11. 05. 2017, 18:43:38
A co jsou zac ty objekty, co je GC nesezere?
prave tam se zadne objekty nevytvari, v tom threadu je jenom smycka, co vypisuje do konzole:
while (true) {
System.out.println("memory ate");
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
//nothing
}
}Citace od: Ivan Nový kdy 11. 05. 2017, 18:53:20
Zkuste prodloužit dobu čekání, možná to čeká na výstup do terminálu.
dobu cekani sem prodlouzil a nic se nezmenilo:-/
Citace od: pecrom kdy 11. 05. 2017, 19:06:09
Citace od: Ondra Satai Nekola kdy 11. 05. 2017, 18:43:38
A co jsou zac ty objekty, co je GC nesezere?
prave tam se zadne objekty nevytvari, v tom threadu je jenom smycka, co vypisuje do konzole:
Nespekuluj a podivej se, v jakych objektech ta pamet je...
tak sem kuknul a toto je vysledek, nevim presne kde se to hleda, ale toto vypada tak nejak nejpravdepodobnejc. Dost je toho v char[], moc mi to nedava smysl.
(http://i.imgur.com/oKayVCh.jpg)
Jakej GC je pouzitej?
Můj tip je, že
System.out je nasměrované do nějakého bufferu.
Citace od: pecrom kdy 11. 05. 2017, 21:31:40
tak sem kuknul a toto je vysledek, nevim presne kde se to hleda, ale toto vypada tak nejak nejpravdepodobnejc. Dost je toho v char[], moc mi to nedava smysl.
(http://i.imgur.com/oKayVCh.jpg)
Je jedno, kolik toho kde je (spousta toho jsou interní alokace Java VM), zajímavé je, kolik toho kde přibývá.
Citace od: Sten kdy 12. 05. 2017, 04:31:53
Můj tip je, že System.out je nasměrované do nějakého bufferu.
Citace od: pecrom kdy 11. 05. 2017, 21:31:40
tak sem kuknul a toto je vysledek, nevim presne kde se to hleda, ale toto vypada tak nejak nejpravdepodobnejc. Dost je toho v char[], moc mi to nedava smysl.
(http://i.imgur.com/oKayVCh.jpg)
Je jedno, kolik toho kde je (spousta toho jsou interní alokace Java VM), zajímavé je, kolik toho kde přibývá.
presne tak, cucel sem v noci na to a hromadi se to v bufferu pro System.out, kdyz odeberu to cekani, tak mi tam zacnou vznikat vznikat dalsi generace objektu a vypada to, ze gc nestiha cistit pamet. je mozne, ze kdybych to nechal jet dostatecne dlouho, ze by to spadlo popr. ze by to zabil system?
Citace od: Karel Rank kdy 12. 05. 2017, 03:15:43
Jakej GC je pouzitej?
zadny sem nenastavoval explicitne, takze defaultni pro java 1.8, takze asi parallel gc
No ono záleží na tom kolik je přiděleno paměti, pokud je stále k dispozici volná paměť GC nic dělat nebude.
Spustí se až JVM nebude schopna alokovat další požadovaný blok paměti.
Můžete naistalovat plugin "Visual GC" a potom sem dejte screenshot.
Omezte aplikaci paměť přes "-Xmx" a uvidíte že se GC začně o paměť starat :O))
Citace od: Stefan kdy 12. 05. 2017, 11:06:05
No ono záleží na tom kolik je přiděleno paměti, pokud je stále k dispozici volná paměť GC nic dělat nebude.
Spustí se až JVM nebude schopna alokovat další požadovaný blok paměti.
Můžete naistalovat plugin "Visual GC" a potom sem dejte screenshot.
Omezte aplikaci paměť přes "-Xmx" a uvidíte že se GC začně o paměť starat :O))
screen je zde (http://i.imgur.com/MP3ciXw.jpg)
zkusim to -Xmx