Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wycieki pamięci a PHP, Pytanie teoretyczne
luinnar
post
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 15.07.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Ostatnio (nie wiem skąd) naszła mni myśl: czy tworzę wyciek pamięci takim kodem:
  1. <?php
  2. $Object = new myClass();
  3. $Object = new myClass2();
  4. ?>


PHP samo usunie instancję klasy myClass z pamięci (tak jak to robi Java ze swoim odśmiecaczem pamięci) czy instancja zostanie w pamięci i zrobi się nam wyciek (tak jak w C)?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
em1X
post
Post #2





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


z tego co wiem, Zend posiada Garbage Collector.
Go to the top of the page
+Quote Post
SongoQ
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Dobre nigdy sie nad tym nie zastanawialem. Najlepiej to sprawdzic odpalajac w petli np 1 mil razy i badajac przyrost pamieci. Wydaje mi sie ze nie bedzie zadnego przyrostu pamieci ale tego nie potrafie potwierdzic bo nie sprawdzalem.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Usuwa.

  1. <?php
  2.  
  3. class GCTest
  4. {
  5. public function __destruct()
  6. {
  7. print( "aaa niszcza mnie" );
  8. }
  9. }
  10.  
  11.  
  12.  
  13. for ( $i = 0; $i < 10; $i++ )
  14. {
  15. print( "[" );
  16. new GCTest();
  17. print( "]n" );
  18. }
  19.  
  20. ?>


Kod
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
Go to the top of the page
+Quote Post
MalCom
post
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 22.01.2006
Skąd: Wodzisław Śl.

Ostrzeżenie: (0%)
-----


Przy zabawie z class.tlen.php, bocik postawiony na tym chodzil przez kilka godzin, po zabicu procesu interpretatora php z ramu ubylo ok. 200MB.
Wydaje mi sie ze w php latwo o wycieki pamieci, przy niezbyt dobrze przemyslanych wiekszych skryptach, ktore jakis czas musza "chodzic". Bo w typowym oskryptowaniu stron to po zakonczeniu skryptu pamiec jest zwalniana.
Zeby poznac blizej problem trzeba byloby zajrzec w zrodla (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
luinnar
post
Post #6





Grupa: Zarejestrowani
Postów: 155
Pomógł: 0
Dołączył: 15.07.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Tak jak mówił SonoQ zrobiłem prosty test:

  1. <?php
  2. class test
  3. {
  4. private $sZmienna = 'aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc
    cdddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeee'
    ;
  5. }
  6.  
  7. for($i = 1; $i < 1000000000; $i++)
  8. {
  9. $Obj = new test();
  10. }
  11. ?>

Po uruchomieniu tego skrypciku nic nie wskazywało na wzrost ilości zajmowanej pamięci.

Aby się upewnić zrobiłem 2 test pokazujący jak powinna się zapychać pamięć gdyby był wyciek:
  1. <?php
  2. class test
  3. {
  4. private $sZmienna = 'aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc
    cdddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeee'
    ;
  5. }
  6.  
  7. $aObj = array();
  8.  
  9. for($i = 1; $i < 1000000000; $i++)
  10. {
  11. $aObj[$i] = new test();
  12. }
  13. ?>

Ilość zadeklarowanej pamięci zaczęła gwałtownie się zwiększać (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Po zakończeniu skryptu komp musiał chwile popracować nad usunięciem z RAMu niepotrzebnych informacji.

Podsumowując
PHP automatycznie usuwa niepotrzebne instancje z pamięci (tak jak java).
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


sorki za odkopywanie staroci - ale skoro nie jest tak różowo to lepiej nie tkwić w błędzie jeśli ktoś to przeczyta...
Cytat(luinnar @ 17.02.2007, 23:50:10 ) *
Podsumowując
PHP automatycznie usuwa niepotrzebne instancje z pamięci (tak jak java).

Jakoś sobie manuala przeglądałem a potem trochu pogooglałem (tak przy okazji znowu na to forum trafiłem a szukałem czegoś podobnego ;p)...
w powyższych przykładach akurat jest usuwana zmienna/referencja (może trochę źle się wyrażę) i o wyciek przy krótko działających skryptach aż nadto nie trzeba się martwić gdyż na koniec i tak to z ramu się upłynni. Jednak jeśli skrypt ma dłużej działać lub coś napisane w stylu demona to pasuje wiedzieć kiedy jest wyciek pamięci - w duuuużym skrócie to jak się usunie "zewnętrzne" odwołanie do obiektu a wewnątrz też była jakaś referencja.... zresztą co tu dużo pisać - ciekawi tematu to odsyłam do manuala:
Garbage Collection

ps. w niektórych wersjach php zdarzają się niektóre funkcje powodujące wyciek pamięci ^^

Ten post edytował zegarek84 25.03.2010, 03:05:27
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
w duuuurzym skrucie
Włącz sobie podświetlanie błędów w przeglądarce...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 21:27