Java VisualVM a rostoucí spotřeba paměti

pecrom

Java VisualVM a rostoucí spotřeba paměti
« kdy: 11. 05. 2017, 18:26:44 »
Zdarec, nasel by se tu nekdo, kdo ma zkusenosti s VisualVM a profilovanim javy? neni mi jasna jedna vec. Mam program:
Kód: [Vybrat]
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?



Diky za pomoc:)
« Poslední změna: 11. 05. 2017, 19:01:39 od Petr Krčmář »


Re:Java VisualVM
« Odpověď #1 kdy: 11. 05. 2017, 18:35:50 »
Ta pamet tam zustava i po zavolani GC? (ve VisualVM na to mas tlacitko)

pecrom

Re:Java VisualVM
« Odpověď #2 kdy: 11. 05. 2017, 18:38:08 »
prave ze jo, furt to vypada, ze to roste

Re:Java VisualVM
« Odpověď #3 kdy: 11. 05. 2017, 18:43:38 »
A co jsou zac ty objekty, co je GC nesezere?

Ivan Nový

Re:Java VisualVM
« Odpověď #4 kdy: 11. 05. 2017, 18:53:20 »
Zkuste prodloužit dobu čekání, možná to čeká na výstup do terminálu.


pecrom

Re:Java VisualVM
« Odpověď #5 kdy: 11. 05. 2017, 19:06:09 »
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:
Kód: [Vybrat]
while (true) {
                System.out.println("memory ate");
                try {
                    TimeUnit.MILLISECONDS.sleep(100);
                } catch (InterruptedException e) {
                    //nothing
                }
            }
Zkuste prodloužit dobu čekání, možná to čeká na výstup do terminálu.

dobu cekani sem prodlouzil a nic se nezmenilo:-/

Re:Java VisualVM
« Odpověď #6 kdy: 11. 05. 2017, 19:12:16 »
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...

pecrom

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #7 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.

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #8 kdy: 12. 05. 2017, 03:15:43 »
Jakej GC je pouzitej?

Sten

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #9 kdy: 12. 05. 2017, 04:31:53 »
Můj tip je, že System.out je nasměrované do nějakého bufferu.

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.


Je jedno, kolik toho kde je (spousta toho jsou interní alokace Java VM), zajímavé je, kolik toho kde přibývá.

pecrom

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #10 kdy: 12. 05. 2017, 10:02:11 »
Můj tip je, že System.out je nasměrované do nějakého bufferu.

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.


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?
Jakej GC je pouzitej?

zadny sem nenastavoval explicitne, takze defaultni pro java 1.8, takze asi parallel gc

Stefan

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #11 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))

pecrom

Re:Java VisualVM a rostoucí spotřeba paměti
« Odpověď #12 kdy: 12. 05. 2017, 11:51:19 »
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

zkusim to -Xmx