2010-02-04 16 views
5

Mam pewne wątpliwości co do ciągów znakówWyrzucanie śmieci i ciągi znaków

Czy są one dostępne w Heap lub String pool?

A jeśli na Kupie zostaną zebrane śmieci, jeśli nie są dostępne na żywo.

A jeśli w puli String, to jak zostaną one usunięte lub usunięte, ponieważ wiemy, że Garbage Collection dzieje się tylko na stercie.

Odpowiedz

8
String s = new String("abc"); 

przedmiotem ciąg skierowany przez s będzie na stercie, a ciąg znaków „abc” będzie w puli strun. Obiekty w puli ciągów nie będą zbierane śmieci. Są one do ponownego wykorzystania w trakcie trwania programu, w celu poprawy wydajności.

+0

Jeśli odnosimy się do pool_ _constant który stanowi część definicji klasy, to tego, że _możesz_ rozładować stałą basen, pod warunkiem, można rozładować klasę (co zwykle wymaga dereferencing ładowacza klas i wszelkie odniesienia do jego załadowany klasy). Trudniejsze niż typowy program, ale Tomcat to robi. –

4

Są one przechowywane w stercie, ale intern() ciągi ED (włącznie napisowych w źródle) są odwołuje z puli w klasie String.

przypadku pojawiają się one jako literałach w kodzie źródłowym oraz wyrażeniami łańcuch znaków (na przykład "a" + "b"), to będą one również odwołania w Class pojawiają się, co zazwyczaj oznacza, że ​​tak długo, jak trwa proces.

Edit: Po wywołaniu intern() na sznurku w kodzie to również dodawane do tej puli, ale ponieważ używa słabe odwołania ciąg może nadal śmieci zebrane jeśli nie jest już w użyciu.

Zobacz także: interned Strings : Java Glossary

cytat z tego artykułu:

Kolekcja smyczki zarejestrowanych w tym HashMap jest czasami nazywany basen String. Jednak są to zwykłe Obiekty i żyją na stercie, tak jak każdy inny (być może w zoptymalizowany sposób, ponieważ internowane Struny mają tendencję do długotrwałego życia).

0

String Alex przechodzi w dosłownym basenie, pozostaje tam tak długo, jak przebiega proces (lub aplikacja internetowa pozostaje załadowany.), Jak powiedział przez finnw i nigdy nie jest śmieci zebrane. Nazwa ciągu2 nie przydziela pamięci dla "Alex" i używa jej ponownie z puli literałów.

PS: Pula literalna również znajduje się na stercie.

Dla ciągu znaków John tworzone są dwa obiekty o nazwach referencyjnych 3 i 4, które są śmieciami do zbierania.

String name = "Alex"; 
String name2 = "Alex"; 

String name3 = new String("John"); 
String name4 = new String("John"); 
Powiązane problemy