perguntas da entrevista de Java (3) - JVM

estruturas de memória JVM.


JVM principal estrutura: pilha, a pilha, a área de método, o contador de programa, permanentemente Geração) (jdk espaço 8 membros utilizando alternativa).
memória heap é dividido em geração jovem ea velha geração.
A geração jovem consiste em três partes, Éden, do sobrevivente e sobrevivente, o índice de alocação de três padrão é 8: 1: 1.
O método da área de dados armazena principalmente informações de classe, uma constante, variáveis estáticas e similares.
Pilha é dividido em pilha máquina virtual Java e pilhas método nativo, cada um correspondendo a um criar um fio java pilha,
cada chamada para um método cria uma pressão quadro de pilha e colocar em pessoas para empilhar, quadros de pilha são utilizados para armazenar dados e parte do processo de métodos os resultados da estrutura de dados,
cada chamada de método dos resultados retornados para o procedimento final, um quadro de pilha corresponde ao processo a partir da pilha para a pilha.
pilhas método nativo é usado principalmente para chamar métodos nativos.
contador de programa (Programa Contador Register) é a JVM uma região de memória menor, o endereço de memória detém uma máquina virtual bytecode instruções do segmento atual de execução.
Todos os tópicos compartilhar a área de memória de dados: método District, heap. A pilha de máquina virtual, pilhas método nativo e contadores de programa são segmento privado.


método dos processos de trabalho, métodos, pilhas método nativo e pilha da JVM pilha Qual é a diferença.


Cada segmento tem sua própria pilha, a pilha contém o quadro de pilha para cada método de execução.
A pilha é uma última na estrutura de dados primeiro a sair (LIFO), o método actualmente desempenhadas no topo da pilha.
Cada vez que o método é chamado, um novo quadro de pilha é criado e salvo para a pilha para o topo da pilha.
Quando o método de retorna ou lança uma excepção não capturado, ele irá aparecer o quadro de pilha.
Além de empurrar e quadro de pilha da pilha, a pilha pode não ser directamente operada.
Pilha quadro pode ser alocada na pilha, e não requer memória contígua.


referências pilha e heap do JVM how para objetos associados.


Após a pilha de produzir uma matriz ou objeto, você também pode definir uma variável de pilha especial,
de modo que o valor deste conjunto pilha variável ou objeto é igual ao primeiro endereço na memória heap, variável de pilha tornou-se uma matriz ou de referência de objecto variáveis.
montão A Java é a área de dados do tempo de execução, o espaço classe (alvo de distribuição.
Esses objetos, estabelecendo novo, newArray, anewarray multianewarray e outras instruções, código de programa, eles não precisam explicitamente liberar.
coleta de lixo Heap é responsável pela o monte é a vantagem de tamanho da memória alocada dinamicamente, a sobrevivência não tem que dizer ao compilador com antecedência,
porque a alocação dinâmica de memória, coletor de lixo do Java automaticamente levado embora esses dados já não é usado em tempo de execução.
no entanto, a desvantagem é que, devido à alocação mais lento dinâmica de memória velocidade de acesso em tempo de execução. 

vantagem Stack é que a velocidade de acesso é mais rápido que o reator, após registo, os dados de pilha pode ser compartilhado.
Mas a desvantagem é que não há dados no tamanho da pilha e sobrevivência deve ser determinada, a falta de flexibilidade.
O principal loja pilha alguns tipos básicos de variáveis (, int, curtas, longas, de bytes, flutuador, duplo, booleano, CH ar) , e o identificador de objecto. 

https://www.cnblogs.com/langren1992/p/4738391.html
https://www.jianshu.com/p/ac162726d7de

Você pode descobrir técnicas de análise de fuga.


Método de fuga: Quando um objecto é definida no método, porque o método pode ser referenciados externamente, tal como para ser passado como os outros métodos nos parâmetros de chamada.
Rosca fuga: Quando um objecto é definida no método, as roscas externas pode ser acedida, por exemplo, para as variáveis de classe ou as variáveis de instância acedidos nos outros segmentos.
Alocados na pilha: o objeto é a fuga não aconteceu, o espaço alocado na pilha. (Espaço alocação de objeto geral na pilha)
está ocorrendo com base no objeto para escapar JVM, atribuído a um diferente (pilha ou pilha) espaço de memória. Se acontecer de escapar, que seria atribuída para a pilha.

https://blog.csdn.net/qq_32575047/article/details/81214178
https://blog.csdn.net/somnusrush/article/details/76027122
https://www.jianshu.com/p/3ecc626ce304


algoritmo comum de GC, CMS e processo de coleta G1 lixo, as várias fases do CMS qual dos dois é o Pare o mundo, o CMS não vai produzir detritos, vantagem G1.
Vários algoritmos diferença reflecte-se na recuperação da antiga geração.

PS
Mark-Copy (STP)
os jovens algoritmo de geração de lixo
marcas - Copiar para copiar a área do Éden e área de S Survior para outra área, e o número de marca de sobrevivência.

CMS (marca varredura atual)
velha geração algoritmo de lixo
marco inicial (STP): primeira marca, a partir do nó raiz, encontrar o primeiro nó para parar
marcação simultânea (não stp): marca concorrente, a partir do marco inicial do nó rotulado nó não-vazia
concomitante-PreClean (não STP): processo de pré-limpeza.
observação (STP): Uma vez que a marca concorrente não é stp, não completamente até marcar todos os objetos precisam observar uma
varredura simultânea (não stp): All Not Tagged limpar
simultânea-reset (não stp): repor os dados internos estrutura
cms irá produzir fragmentação de memória.
cms é baseada na "marca - sweep" algoritmo coletor, uma grande quantidade de fragmentação de memória Isto significa que a coleta de lixo é concluída,
quando um grande objeto não é espaço contíguo suficiente para alocar, tem de desencadear uma GC completa com antecedência, o aumento stp tempo.

G1
lixo primeiro algoritmo:
Inicial Mark (STP): CMS e a mesma operação é simultaneamente menor GC.
digitalização região raiz (STP): Referências para sobreviver a área de digitalização inicial marcado na velhice, e marcar os objetos referenciados. (Pequena operação gc comum)
concomitante Mark (não STP): marca concorrente, a partir do nó de ponto de partida inicial marcado nó não nulo,
o cálculo da taxa de sobrevivência para cada região-alvo para facilitar o uso de até limpo depois fases
observação (STP): Desde marca concorrente não é stp, não completamente até marcar todos os objetos precisam re-marca a
limpeza (não stp): Limpar esvaziar Região (não sobreviveu objeto), adicionado à lista livre. região reciclagem só não objeto, você não precisa stp.
CMS e a diferença entre G1:
G1 organização mudou memória, espaço de memória não é contínua,
mas uma região (em E (Eden), S (sobrevivente ), O (velho), H (Humongous)).
observação algoritmo marcador de fases, em seguida mudado, algoritmo g1 é SATB (instantâneo-em-o- início).
jdk 11 g1 como o coletor de lixo padrão.
Vantagens:
G1 é um processo de consolidação da memória coletor de lixo, não produz uma grande quantidade de fragmentação de memória.
do G1 parar o mundo (STW) mais controlável, G1 acrescenta mecanismo de previsão sobre o tempo de permanência, o usuário pode especificar um desejado Dwell Time.

https://tech.meituan.com/g1.html


Limpar a compreensão das vantagens e desvantagens marcas e etiquetas para organizar algoritmo.

Mark - algoritmo de varredura (Mark-varredura)
  "marca - sweep" algoritmo, como o próprio nome sugere, o algoritmo é dividido em "marca" e "clara" em duas etapas:
primeiro marca todos os objetos precisam ser recuperado, depois de marcar a conclusão da unidade Todos os objetos são recuperados fora da marca.
A razão pela qual é o algoritmo mais básico coleção, porque algoritmos de coleta subseqüentes são baseados nesta idéia e fazer melhorias para suas deficiências obtidos.
Ele tem duas desvantagens principais:
(1) Eficiência: Eficiência marcação e processo de remoção não é alta;
(2) o problema de espaço: irá produzir grandes quantidades de fragmentação marca memória descontínua após detritos espaciais compensação poderia causar muito,
em excesso pode causar grandes objetos de detritos não pode alocar memória contígua suficiente, que teve de GC gatilho com antecedência, mesmo Stop the World.
Mark - acabamento (Mark-Compact)
   algoritmo de coleta de copiar irá realizar mais operações de cópia em maior sobrevivência alvo, a eficiência será baixo.
Mais ao ponto, se você não quer perder 50% do espaço, você precisa ter garantia de espaço alocado adicionais,
em resposta a memória usada por todos os objetos são 100% de sobrevivência em casos extremos, é o velho general não pode escolher diretamente este algoritmo.    
De acordo com as características da velhice, sugere-se que um outro tipo de "marca - terminando" algoritmo (Mark-Compact),
o processo de marcação ainda é a "marca - sweep" algoritmo o mesmo, mas os passos subsequentes não são reciclados diretamente objetos para limpar,
mas deixar todos os objetos sobreviventes são movidos para o fim, em seguida, limpar a memória diretamente fora do limite do terminal.

https://blog.csdn.net/wuzhiwei549/article/details/80563134

A proporção de distrito sobrevivente do Éden, porque é que este ratio, o processo de trabalho do éden sobrevivente.

O rácio de incumprimento é de 8: 1: 1.
Como os objetos de geração de jovens são, basicamente, à noite cru em direção à morte (80%), de modo que o algoritmo de coleta de lixo geração jovem usando o algoritmo de cópia.
geração jovem eden nascido na área, juntamente com uma gc, copie o distrito de Éden para o distrito do sobrevivente, +1 idade.
Mais uma vez recuperado, copiar e do Éden da zona Survivor Para sobrevivente a zona. Com idade superior a 8 anos de idade, para a velha geração.

https://www.jianshu.com/p/534ab3c8335f
 

Como a JVM para determinar se um objeto é GC, o que pode ser visto como existem vários tipos de raiz.

raízes GC. Se o caminho não atingir o objecto de raiz a partir de um objecto, ou a partir do objecto de raiz não pode ser uma referência para o objecto que está inacessível.
raízes GC:
    Objeto 1. Virtual Machine (JVM) referências a pilha 
        durante a execução de cada método, a JVM cria um quadro de pilha correspondente (quadro de pilha incluindo operando pilha, tabela de variáveis local, citações, muitas vezes executados piscina),
        quadro de pilha, que inclui todos os objectos utilizados no âmbito do método de referência (claro, há outros tipos de base de dados), quando a aplicação do último método, o quadro de pilha seja removido da máquina de pilha virtuais
    propriedades estáticas de classe 2. a forma de zona de referência objecto
    objectos referenciados 3. o método de região constante (valor final constante)
    4. um método nativo pilhas objecto de referência JNI

https://blog.csdn.net/u012941811/article/details/52427372

A diferença entre as operações GC referência phantom fortes e fracos em como eles executam.

Citar forte:
coletor de lixo nunca vai recuperá-lo
quando não há espaço de memória suficiente, Java Virtual Machine preferem jogar OutOfMemoryError erros, finalização anormal do programa, não vai se recuperar por objetos aleatórios que têm referências fortes para resolver o problema de memória insuficiente.
Citar Soft:
Se o espaço de memória é insuficiente, ele irá recuperar a memória desses objetos
pode ser usado para implementar caches memory-sensitive. Se o objecto de referência macio referenciado é lixo, máquina virtual Java será adicionado a esta referências citadas moles fila associada.
referências fracas:
ciclo de vida mais curto, independentemente do espaço de memória atual é suficiente ou não, irá recuperar sua memória.
Se o objecto de referência macio referenciado é lixo, máquina virtual Java será adicionado a esta referências citadas moles fila associada.
Citação falsa:
objeto de referência phantom não determina o ciclo de vida, é provável que seja lixo coletado a qualquer momento.
E referência deve fazer referência as filas virtuais (o ReferenceQueue) usados em combinação.

https://blog.csdn.net/panyongcsd/article/details/46605613

Se Java pode ser diretamente a memória GC.

O tampão NIO fornece uma memória JVM pode ser usado sem acesso directo a física classe sistema de memória --DirectBuffer.
 herda classe DirectBuffer de ByteBuffer, ByteBuffer diferente, mas, ordinário ByteBuffer ainda memória ordinária JVM alocado na pilha,
 a memória máxima é limitada pela memória máxima acumulada; e DirectBuffer alocados diretamente na memória física, não ocupa espaço de pilha, o seu você pode aplicar para a memória máxima limitada pelo sistema operacional.
(Nota: DirectBuffer não é realmente para OS Aloca memória de aplicação, que é em última análise, para a memória alocada por allocateMemory chamando inseguro de (), mas JVM do tamanho Direct Memory podem também aplicar limitado, disponível -XX :. configurações 1M MaxDirectMemorySize =, JVM coleta de lixo não é parte do gerenciamento de memória.)
em comparação com a alocação de memória heap JVM (alocar), alocação de memória melhor direta (allocateDirect) desempenho de acesso, mas a distribuição mais lento.

https://www.cnblogs.com/z-sm/p/6235157.html?utm_source=itdadao&utm_medium=referral
http://www.importnew.com/21998.html

Java processo de carregamento de classe.

Carregando link (validação, preparação, analítica), a inicialização.
Carga: os arquivos de classe bytecode de várias fontes de carregador de classe carregados na memória.
    fonte de bytecode. carga geral gerada a partir de fontes, incluindo compilado em arquivos o caminho local .class de pacote de arquivos jar .class, de uma rede remota, compilador em tempo real e proxy dinâmico
    carregador de classe. carregador de classe incluem geralmente promotor, o carregador de classe de extensão, aplicações de carregadora classe, e carregador de costume classe de utilizadores.
Verificação: principalmente para garantir o fluxo de entrada de bytes carregados em linha com Virtual Machine Specification, não vai representar um erro de segurança.    
Preparação: O principal é alocar memória para variáveis de classe (note, não variáveis de instância), e dado o valor inicial. Java Virtual Machine é um valor inicial, dependendo do tipo da variável padrão.
Análise: A piscina constante de referências simbólicas para o processo de substituição de referências diretas.
    referências símbolo. Ou seja, uma string, mas a corda pode ser dado número único de identificação de um método, uma variável, uma classe de informações relacionadas.
    referência direta. Ele pode ser entendido como um endereço de memória, ou um deslocamento. Tal como método de aulas, uma referência directa a uma classe variável é um ponteiro para a área do método;
    referência directa a um método de exemplo, as variáveis de instância é um exemplo do indicador de topo uma vez que o início da posição exemplo variável compensado
de inicialização: classe principal inicialização variável, o processo é realizado no construtor da classe. Modificação da instrução de inicialização estático ou variável.

https://blog.csdn.net/ln152315/article/details/79223441
https://www.cnblogs.com/xiaoxian1369/p/5498817.html

 

Pais modelo de processo de delegação e as vantagens.

códigos implementadas pai modelo delegação estão concentrados na java.lang.ClassLoader loadClass () Método:  
primeiro verifica se a solicitar a classe já foi carregado através da carga,  
se não-carregado:  
chamada recursiva carregador classe pai loadClass () ;  
pai classe de carregador está vazio após o uso para iniciar classes carregadas;  
se o carregador de classe pai e classe de carregador são incapazes de iniciar pedido de carregamento, carregando a função chamadas em si.
Vantagem;
as classes Java, juntamente com sua classe loader tem uma relação hierárquica com uma prioridade para garantir que a ordem de carregamento em vários ambientes de carga.  
Para garantir a segurança da operação, para evitar a classe não confiável jogado uma classe confiável.

https://blog.csdn.net/inspiredbh/article/details/74889654
https://blog.csdn.net/qq_38182963/article/details/78660779

 

Convencional JVM parâmetros de ajuste.


traço traço:
breves informações 1. Imprimir o GC:
-verbose: GC
-XX: + PrintGC
2. Imprima detalhes GC :( produção não use)
-XX: + PrintGCDetails
3. Especifique a localização do GC log:
-Xloggc: log / gc.log
informações do carregador 4. classe:
-XX: + TraceClassLoading
5. a memória da pilha é fornecida:
-Xms1g -Xmx1g
6. o OOM caminho derivada:
-XX: D = HeapDumpPath: /a.dump
7. o tamanho da pilha inicial
-Xms
. 8 o tamanho máximo da pilha
Xmx


A análise do arquivo de despejo.


jmap -dump: file = filename .dump [pid]
o JDK vem VisualVM


Java tem nenhuma maneira activa gatilho GC (nenhum).


System.gc ();
// ou abaixo, tanto do equivalente
gc Runtime.getRuntime () () ;.
Apenas aviso de GC, e não é realizado.


Diferenças e conexões entre vazamentos de memória e estouro de memória

vazamento de memória recorrente:
vazamento de memória Código a ser executado várias vezes, cada vez a ser executado vai levar a um vazamento de memória.
vazamento de memória ocasionais:
vazamento de memória Código ocorre apenas em determinada operação ambiental ou processo irá ocorrer. Recorrente esporádica e são opostas.
Para um ambiente particular, esporádica talvez torna-se muitas vezes feitas de. Assim, o ambiente de teste e métodos de ensaio para detectar vazamentos de memória é essencial.
Um tempo de vazamento de memória: vazamento de memória Um ocorre no código só será executado uma vez, ou devido a defeitos no algoritmo, haverá sempre uma causa justa e um vazamento de memória.
Por exemplo, alocados na memória de classe construtor, mas não divulgou o destruidor de memória, de modo que o vazamento de memória ocorre apenas uma vez.
vazamento de memória implícita: non-stop aloca programa de memória durante a operação, mas apenas até ao final de memória livre.
Estritamente falando, um vazamento de memória não aconteceu aqui, porque a liberação da memória programa final de todas as aplicações.
Não liberação tempestiva de memória também pode levar, eventualmente, ficar sem sistemas de memória. Então, nós chamamos este tipo de memória vazamentos de memória vazamentos implícitas.
Memória causas e soluções estouro:

Fora da razão de memória: 
a quantidade de dados carregados na memória é muito grande, tal como o tempo excessivo necessário a partir do banco de dados; 
classe recolha tem uma referência a um objecto, não esvaziado depois da utilização, não pode ser reciclado de modo que JVM; 
ciclo mortos ou ciclos presente geração de código muitos entidade objeto duplicado; 
software de terceiros usado no BUG; 
os valores dos parâmetros de inicialização muito pequeno conjunto de memória
solução de estouro de memória: 
modificar os parâmetros de JVM inicialização, diretamente aumentar a memória. (-Xms, parâmetros -Xmx não deve esquecer de adicionar.)
Verifique o log de erro, consulte "OutOfMemory" se há outras anomalias ou erros antes de o erro.
O código de instruções passo a passo e análise para identificar potenciais áreas de estouro de memória.


https://blog.csdn.net/ruiruihahaha/article/details/70270574

Publicado 115 artigos originais · ganhou elogios 58 · Exibições 230.000 +

Acho que você gosta

Origin blog.csdn.net/Angry_Mills/article/details/82107305
Recomendado
Clasificación