A string ocupa uma grande quantidade de memória em qualquer aplicativo. Em particular, a matriz de char [] que contém o caractere UTF-16 independente contribui mais para o consumo de JVM, porque cada caractere ocupa 2 dígitos.
30%da memória é realmente muito comum. Usando a atualização Java 8, agora podemos entrar em contato com um novo recurso, chamado de string para ser pesado.
A string é usada para re -usar a interna da string é na verdade a matriz de char e o recurso da final, para que a JVM possa manipulá -las arbitrariamente.
O desenvolvedor considera muitas estratégias para a string de string, mas a implementação final é usada na implementação final:
Sempre que o dispositivo de recuperação de lixo acessa o objeto String, ele marcará a matriz CHAR. Ele obteve o valor de hash da matriz de char e existe com uma fraca referência à matriz. Enquanto o recuperador de lixo encontrar outra corda, e essa string e a matriz char têm o mesmo código de hash, os dois serão comparados com um caractere e um caractere.
Se eles simplesmente corresponderem, uma string será modificada, apontando para a matriz de char da segunda string. A primeira matriz de char não é mais citada, para que possa ser reciclada.
Obviamente, todo esse processo traz algumas despesas, mas é controlado por um limite superior muito apertado. Por exemplo, se um personagem não for repetido, ele não será mais verificado por um período de tempo.
Então, como esse recurso funciona? Primeiro de tudo, você precisa apenas lançar a atualização Java 8 e depois seguir esta configuração: -xmx256m -xx:+useg1gc para executar o seguinte código:
Classe pública lotesfstrings {private static final LinkedList <string> lotes_of_strings = new LinkedList <() (); J = 0; );}}}
Este código será relatado como OSTOfMemoryError após 30 iterações.
Agora, abra a string para ser pesado, use a seguinte configuração para executar o código acima:
-Xmx256m -xx:+useg1gc -xx:+usestringdeduplication -xx:+printStringulicationStator
Neste momento, ele pode ser executado por mais tempo e só terminará após 50 iterações.
A JVM também imprimiu o que fez, vamos dar uma olhada:
[GC concorrente-deeduplicação, 4658.2k-> 0,0b (4658,2k), AVG 99,6%, 0,0165023 seg] [Último executivo: 0,0165023 Secs, INCLE: 0,0953464: [Snappd: 0 (0,0%)] [Hashed: 119538 (100,0%)] [conhecido: 0 (0,0%)] [Novo: 119538 (100,0%) 4658.2k] [Deduplicado: 119538 (100,0%) 4658.2K (100.0 .0.0] [Young: 372 (0,3%) 14,5k (0,3%)] [Old: 119166 (99,7%) 4643,8k (99,7%)] [Exec. : 0/0,0000000 sr] [Inspecionado: 557503] [Saltado: 0 (0,0%)] [Hashed: 556191 (99,8%)] [conhecido: 903 (0,2%)] [Novo: 556600 (99,8%) 21.2m] [ Deduplicado: 554727 (99,7%) 21,1m (99,6%)] [Young: 1101 (0,2%) 43,0k (0,2%)] [Old: 553626 (99,8%) 21,1m (99,8%)] [Tabela] [Uso da memória : 81.1k] [Tamanho: 2048, Min: 1024, Máx: 16777216] [Entradas: 2776, Carga: 135,5%, em cache: 0, adicionado: 2776, removido: 0] [RESIMENTE CONTATO: 1, encolher trêsoldes: 13 65 (65 (66,7%), Limiar de Grow: 4096 (200,0%)] [Contagem de Realquecimento: 0, Limiar de Realquente: 120, Hash Seed: 0x0] [Limiar de idade: 3] [fila] [Droped: 0]
Por conveniência, não precisamos calcular a adição de todos os dados por nós mesmos, e basta usá -los convenientemente.
O segmento de código acima estipula que a string é atingida pesada.
Os recursos acima são lançados, o que significa que ele pode não ser revisado de forma abrangente.具体的数据在实际的应用中可能看起来有差别 , 尤其是那些应用中字符串被多次使用和传递 , 因此一些字符串可能被跳过或者早就有了 HashCode (正如你可能知道的那样 , Um código de hash de string foi carregado preguiçosamente).
Nos casos acima, toda a string é pesada e 4,5 MB de dados são removidos na memória.
[Tabela] Parte das informações estatísticas sobre a tabela de rastreamento interna é fornecida.
Então, qual é a diferença entre ponderação de cordas e residência de cordas? De fato, a string depende dela é semelhante à residência.
A controvérsia do criador da proposta de aprimoramento JDK 192 é que os desenvolvedores geralmente não sabem onde colocar a sequência residente é apropriada, ou está oculta pela estrutura. do país), você precisa de algum senso comum.
Quando a string permanece no thread do aplicativo, quando a recuperação de lixo é assíncrona e transmitida, as cadeias não aumentam o consumo durante o tempo de execução. Ele adicionará muita pressão ao GC, para que a string não aconteça.