Narzędzie do analizy użycia pamięci

Narzędzie do analizy użycia pamięci
mychal
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Przedmonitorze Górne
0

Cześć!
Szukam narzędzia, które pokaże mi powód, dla którego aplikacja zżera sporo pamięci. Sprawdziłem aplikację pod kątem wycieków pamięci. Idealne narzędzie powinno pokazać mi nazwy typów, liczbę instancji danego typu oraz rozmiar.
Zapoznałem się z tym tematem http://stackoverflow.com/questions/9720943/how-to-analyze-excessive-memory-consumption-pagefileusage-in-a-delphi-applicat/
Ściągam AQtime, aby sprawdzić, czy mnie usatysfakcjonuje.
Próbowałem użyć VMMap, lecz dostarcza za mało informacji.
Nie mam za bardzo doświadczenia w tym zakresie, aplikacja jest dość duża, dlatego chciałbym uniknąć babrania się w źródłach.

EDIT: Aplikacja jest stworzona przy użyciu Delphi 7. Jednak minimalnym nakładem pracy mogę również odpalić ją na XE2.


I fart u die.
edytowany 1x, ostatnio: mychal
0

Idealne narzędzie powinno pokazać mi nazwy typów, liczbę instancji danego typu oraz rozmiar.

Bodajże w nowszych Delphi jest coś takiego jeżeli chodzi o wycieki.

Ściągam AQtime, aby sprawdzić, czy mnie usatysfakcjonuje.

Najpierw pytam, potem szukam. Genialne.

Próbowałem użyć VMMap, lecz dostarcza za mało informacji.

Zdefiniuj za mało.

Nie mam za bardzo doświadczenia w tym zakresie, aplikacja jest dość duża, dlatego chciałbym uniknąć babrania się w źródłach.

Powodzenia. Może chcesz żeby samemu ci kod poprawiło? Debugger też powinien od razu sam poprawiać kod. A IDE pisać cały kod po wciśnięciu pierwszej literki.

Szukam narzędzia, które pokaże mi powód, dla którego aplikacja zżera sporo pamięci.

Zdefiniuj sporo.

mychal
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Przedmonitorze Górne
0
-123oho napisał(a)

Najpierw pytam, potem szukam. Genialne.

Informacji na ten temat szukałem zanim tutaj napisałem. To, że zaraz będę sprawdzał kolejne narzędzie(kobylaste jak cholera) po kilku już sprawdzonych, nie znaczy, że ktoś nie zna lepszego sposobu.

-123oho napisał(a)

Bodajże w nowszych Delphi jest coś takiego jeżeli chodzi o wycieki.

Nie wiem, ale odpowiadam - genialne. W XE2 jest narzędzie dostarczane z FastMM - FastMMUsageTracker - pokazuje tyle info ile VMMap(o tym niżej).

-123oho napisał(a)

Zdefiniuj za mało.

Nie podaje informacji o zaalokowanych typach oraz ich rozmiarach. Podaje adresy zajętych bloków pamięci oraz ich rozmiary

-123oho napisał(a)

Powodzenia. Może chcesz żeby samemu ci kod poprawiło? Debugger też powinien od razu sam poprawiać kod. A IDE pisać cały kod po wciśnięciu pierwszej literki.

Inne posty kolegi w podobnym tonie widzę:) Źle się wyraziłem - kod oczywiście przeanalizowałem, jednak nie mogę doliczyć się ilości danych za chiny.

-123oho napisał(a)

Zdefiniuj sporo.

500MB, gdzie szacunkowo powinno być 150-200.


I fart u die.
edytowany 3x, ostatnio: mychal
0

Nie podaje informacji o zaalokowanych typach oraz ich rozmiarach. Podaje adresy zajętych bloków pamięci oraz ich rozmiary

Nie podaje rozmiarów ale podaje rozmiary. Tak wiem o co ci chodzi, ale brzmi to bez sensu. Jeżeli liczysz na więcej niż adres i rozmiar to powodzenia, bo normalnym ludziom to wystarczy... Normalne reporty takie coś obejmują + stack alokacji ew. dealokacji (jeżeli zwolnione częściowo). I czego tutaj więcej chcieć, bo nie rozumiem? No chyba że jesteś pseudoprogramistą który liczy na to że mu wyświetli co ma zmienić na co albo najlepiej samemu poprawi. Bo z tego co mówisz coś takiego wynika.
Jak masz aż takie problemy żeby to znaleźć to użyj jakiegoś nowszego Delphi, tam jakiś system wykrywania wycieków jest dodawany, a FastMM bodaj jeszcze lepsze reporty generuje (ale nie jestem pewien). Skoro to tobie nie pomaga to przerzuć się na np. szydełkowanie..

Inne posty kolegi w podobnym tonie widzę:)

Hehe . Chciałbym żeby było więcej postów gdzie bym mógł nie mówić o szukaniu w google i ganić za głupotę.

Źle się wyraziłem - kod oczywiście przeanalizowałem, jednak nie mogę doliczyć się ilości danych za chiny.

Masz debugger, nie wiem w czym leży twój strasznie dziwny problem... Btw. patrz dalej

500MB, gdzie szacunkowo powinno być 150-200.

Szacunkowo powinno być tyle bo? Tyle mówisz? I btw. patrz wyżej, czy nie wydaje ci się że skoro nie możesz się doliczyć ilości danych to możesz oszacować zajętość w ramie?

Może daj jakiś kod i reporty, jeżeli to nie jest jakieś masakrycznie skomplikowane bo wtedy to się mija z celem.

mychal
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Przedmonitorze Górne
0

Chyba źle mnie zrozumiałeś. Nie chodzi mi o wycieki pamięci - tych nie ma(sprawdzone fastMM'em). Chodzi o informację co w danym momencie znajduje się w pamięci. Np. w jakimś typie mam tablicę o bardzo dużym rozmiarze i wiele instancji danego typu.

-123oho napisał(a)

Szacunkowo powinno być tyle bo?

Bo tworzę sobie X(25k) obiektów, sumuję rozmiar pól klasy, wszystkich nadklas oraz mnożę sumę przez X. I rezultaty znacznie się różnią. Dlatego chciałbym się dowiedzieć co pominąłem.


I fart u die.
0

Bo tworzę sobie X(25k) obiektów, sumuję rozmiar pól klasy, wszystkich nadklas oraz mnożę sumę przez X. I rezultaty znacznie się różnią. Dlatego chciałbym się dowiedzieć co pominąłem.

Pominełeś narzut związany z całym system, kodem, a sam TObject też coś waży (i nie jest to tak mało jak się może wydawać).

Chodzi o informację co w danym momencie znajduje się w pamięci.

No to trochę zmienia problem, bo sam nigdy nie miałem problemów z programem który zajmuje za dużo ramu. Debugger powinien pomóc bo mówisz że masz ileś obiektów jakiegoś typu. W każdym razie jeżeli jest ich aż tyle to rosną narzuty chociażby poprzez wszystkie referencje do tych typów (gdzieś trzeba przechować te wszystkie wskaźniki), dodatkowo kod debuggujący może powodować dodatkowy narzut...

mychal
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Przedmonitorze Górne
0

Sprawdzałem to przy wyłączonych informacjach debugujących. InstanceSize dla TObject daje 4B(który uwzględniłem w obliczeniach, 4B vtable również uwzględniłem). Możesz rozwinąć swoją wypowiedź dotyczącą narzutów? Na pewno narzuty o których mówisz istnieją, jednak nie sądzę, aby w tym przypadku były jakieś znaczące.


I fart u die.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Powiedz czy użycie pamięci rośnie czy się trzyma na tym samym poziomie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
mychal
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Przedmonitorze Górne
0

Po utworzeniu wszystkich obiektów użycie pamięci się nie zmienia.

EDIT:
Generalnie w całym moim pytaniu chodzi o polecenie narzędzia do ułatwienia analizy tego zjawiska. Zwyczajnie chciałem oszczędzić sobie zbędnego zachodu, myśląc, że problem jest raczej popularny. W sobotę do tego wracam i najprawdopodobniej czeka mnie zwykła dokładna analiza całego kodu linijka po linijce, czego zwyczajnie chciałem uniknąć bo aplikacja jest dość rozbudowana.


I fart u die.
edytowany 1x, ostatnio: mychal
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)