Czy muszę się martwić o String Constant Pool?

głosy
2

Mam aplikacji Java, który jest bardzo ciężki String - zajmuje kanał ogromnych ilości dużych, różnych obiektów String.

Czy muszę się martwić o String Constant basen dla pamięci i wydajności?

Czy istnieje jakiś sposób, aby zobaczyć, jak duży basen jest w dowolnym momencie?

Utwórz 10/10/2008 o 11:18
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
4

Jak powiedział Mario, stała pula ma zastosowanie jedynie do intern () Struny ed, i ciągi znaków, które są stałe w kodzie Java (są one domyślnie internowany).

Ale jest jeszcze jedno zastrzeżenie, które mogą mieć zastosowanie do przypadku: substring()metoda będzie dzielić bazowego char[]z oryginalnym String. Więc wzoru

  String large = ...                  // read 10k string
  String small = large.substring(...) // extrakt a few chars
  large = null;  // large String object no longer reachable,
                 // but 10k char[] still alive, as long as small lives

może spowodować nieoczekiwane wykorzystanie pamięci.

Odpowiedział 10/10/2008 o 12:05
źródło użytkownik

głosy
3

Jeśli jest to pasza obiektów, następnie nie idą w ciąg stałej puli chyba nazwać intern (), o ile wiem. Zużycie pamięci dla internowanych strun nie jest z kupa, ale z przestrzeni pamięci Perm Gen, więc jeśli stażysta wiele ciągów aplikacja katastrofie z OutOfMemory, nawet jeśli nie jest dużo Heap lewo.

Więc nie powinno być problemem, jeśli nie jesteś interning wszystkich tych ciągów. Jeśli staje się obawy, że byłoby to możliwe, aby mieć własną implementację Mapa aby przechowywać te struny, więc nie skorzystać z mechanizmu wewnętrznego.

Sprawdziłem wdrażania metody intern () i jest rodzimy, więc nie wydaje się być prosta do pomiaru zużycia pamięci lub zobaczyć zawartość basenu.

Można użyć tej flagi, aby zwiększyć PermSize jeśli zabraknie pamięci:

-XX:MaxPermSize=64m
Odpowiedział 10/10/2008 o 11:37
źródło użytkownik

głosy
1

Myślę, że powinieneś profil aplikacji, zarówno z jak i bez internowania. Następnie dokładnie zobaczyć, co efekt jest.

Nie wierzę, że istnieje sposób, aby zobaczyć rozmiar strun stałej puli.

Odpowiedział 10/10/2008 o 11:21
źródło użytkownik

głosy
0

W Javie 1.7 podciąg () - metoda nie jest już przy użyciu tego samego char [] to zamiast tego skopiować ciąg sub do nowej tablicy tj

public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

które konstruktora beginIndex łańcuchy gdy nie jest równa zeru lub endIndex nie jest równa długości char [] tablicy.

public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
Odpowiedział 13/08/2015 o 06:20
źródło użytkownik

głosy
0

Nie wiedząc dokładnie, co program jest, mogę tylko proponuję próbować używać strun jako strumień, a nie przechowywać ciąg jako całość. Być może trzeba zrobić więcej dla swojej aplikacji abstrakcje i wymyślać pośrednią reprezentację, która jest bardziej wydajna pamięć?

Odpowiedział 10/10/2008 o 12:22
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more