C# Memória spórolás(?) felszabadítás
2013-11-14T22:09:53+01:00
2013-11-15T20:44:04+01:00
2022-07-23T03:43:53+02:00
  • Bocsi, de miből következtettél erre?
    Mutasd a teljes hozzászólást!
  • "Miért kell optimalizálni? Kinek fáj az a 30-40MB memória?"


    A felhasználónak...
    Mutasd a teljes hozzászólást!
  • 30-40 MB az semmi egy formos alkalmazástól. Csak néhány példa, most próbáltam ki hogy egyes programok mennyit foglalnak indítás után közvetlenül:

    Wordpad: 26 MB
    Chrome: 250 MB (4 különböző processt indít)
    IE 10: 50 MB (2 process)
    Skype: 150 MB
    Firefoxban most 2 tab van nyitva (gmail és prog.hu): 400 MB

    40 MB-nyi memória az éppen 100 Ft-nak felel meg. Ha ebből hetekig tartó trükközéssel mondjuk le tudnál faragni 10 MB-ot, nem lennél sokkal előrébb. (25 Ft vs. több heti munkabéred).

    Ilyesfajta trükközésekre egy desktop alkalmazásnál nagyon ritkán van szükség. Egy telefonon se számít már semmit +/- 10 MB.
    Mutasd a teljes hozzászólást!
  • Helló!

    Nyugi, a memóriafoglalás nem lineárisan növekszik. Pl. a program futásához be lett rántva egy halom library, viszont egy újabb form létrehozása nem fog újabb 30-40 MB-ot megenni, mivel ugyanazokat a lib-eket használja, amelyek már a memóriában vannak.

    Ezen kívül a GC-t okos emberek írták, és eleve erősen optimalizált, így hacsak nagyon pontosan nem tudod, mit csinálsz, nagy valószínűséggel csak rontani fogsz a teljesítményen (tipikus példa erre a GC.Collect() hívogatása). Terjedelmi okokból nem megyek bele a részletekbe (van szakirodalom bőven), de érdemes tudni, hogy a GC adaptív, pl. ha van bőven szabad memória, ritkábban takarít, hiszen a takarítás is erőforrásigényes, így a program nagyobbra hízhat. Tehát igazából semmilyen következtetést nem lehet az éppen lefoglalt memóriamennyiségből levonni.

    Amire ezzel szemben nagyon oda kell figyelni, az a memóriaszivárgás: még managed kód esetén is lehet ugyanis szivárgó kódot létrehozni. Erre tipikus példák: az unmanaged erőforrások használata után nem megfelelő felszabadítás (Dispose() hívása, ill. szebben using blokk használata), ill. az esetleges ciklusban történő, eseményre feliratkozás a leiratkozás nélkül.

    Összefoglalva: akkor foglalkozz a problémával, ha használat során láthatóan folyamatosan nő a memóriahasználat (esetleg többet nő, mint csökken).
    Mutasd a teljes hozzászólást!
  • A GC motor alapból nem is akar felszabadítani, amíg nem szükséges.
    Sok progi úgy lép ki, hogy nem is kellett indítani GC-t a kilépésig (ott is csak a destruktorok miatt). Egyzserűen ott csücsül a memóriában a halott objektumok területe, mert nincs ok amiért kiseperje.

    Az meg hogy egy-egy alkalmazásnak mennyi memóriát utal ki a .Net motor az optimalizálható (default, OS memória mérettől függ ill. te is megadhatod, pl. az alkalmazás módjától függően, pl. szerverhez és sok párhuzamos progihoz mást állíthatsz mint klienshez, azon egy-két .Net alkalmazás - esetleg irdatlan memória igénnyel.

    Még a GC stratégia is állítható, ha jól emlékszem jelenleg csak szerver vagy kliens értékek között.
    Mutasd a teljes hozzászólást!
  • Igen ,lehetséges a memória limit beállítása(ha jól tudom (Hernyák féle ProgII-ben is volt róla szó :)) Nem sok az a 30-40MB,csak a kíváncsiság hajtott. De igaz,minek pazaroljak időt ha nem létszükséglet még az optimalizálás.
    Mutasd a teljes hozzászólást!
  • Miért kell optimalizálni? Kinek fáj az a 30-40MB memória?

    Egy üres Form mennyi memóriát eszik? Szerintem az sem sokkal kevesebbet, mindenesetre összemérhető nagyságrendet.

    Ha fölösleges optimalizálni, akkor kár beleölni az időd!
    (Ha nincs vele probléma, ne csinálj magadnak)

    Nem vagyok .NET guru, de gondolom állítható, hogy a GC mekkora memória területeket foglaljon be magának alapból. Ennek az értékével biztos lehet spórolni!
    Mutasd a teljes hozzászólást!
  • Üdv mindenkinek.
    A problémám a következő :
    Van egy Formom amely MySQL-hez csatlakozik,DataGridView-el jelenítek meg adatokat,továbbá user_controllokkal van elkészítve a program.Menüpontok kattintásakor nem új ablakban hanem a főalakban nyílik meg a menüpont.
    Az alkalmazás kb 30MB-t emészt fel a memóriából,a programból való kilépéssel azonnal felszabadul az általa lefoglalt 30-38MB - foglalt memória.
    Tanácsokat kérnék hogyan lehetne/lehet jól memóriát spórolni,hogyan faraghatok le a felhasznált MB-ből?
    Soknak számít a 30-38MB-egy olyan alkalmazástól amelynek 10 menüje van abból kb 6 adatbázis tevékenységekhez kötött,van egy súgóm is amit készítettem. (Tudom nem lehet pontos számadatot ennyi információból leszűrni,de saccra gondolok)
    Mutasd a teljes hozzászólást!
abcd