O que significa o tamanho da memória virtual na parte superior?

124

Estou executando toppara monitorar o desempenho do servidor e dois dos meus processos java mostram memória virtual de até 800 MB-1 GB. Isso é uma coisa ruim?

O que significa memória virtual?

E ah btw, eu tenho swap de 1GB e mostra 0% usado. Então, eu estou confuso.

Processo Java = 1 servidor Tomcat + meu próprio daemon java Servidor = Ubuntu 9.10 (karmic)

kapso
fonte

Respostas:

142

A memória virtual não é necessariamente necessariamente memória. Por exemplo, se um processo mapeia um arquivo grande, ele é realmente armazenado no disco, mas ainda ocupa "espaço de endereço" no processo.

O espaço de endereço (por exemplo, memória virtual na lista de processos) não custa nada; Não é real. O que é real é a coluna RSS (RES), que é a memória residente. Essa é a quantidade de memória real que um processo está ocupando.

Mas mesmo essa não é a resposta completa. Se um processo chamar fork (), ele será dividido em duas partes e os dois compartilharão inicialmente todo o RSS. Portanto, mesmo que o RSS tenha inicialmente 1 GB, o resultado após a bifurcação seria dois processos, cada um com um RSS de 1 GB, mas você ainda usaria apenas 1 GB de memória.

Confuso ainda? Aqui está o que você realmente precisa saber: use o freecomando e verifique os resultados antes e depois de iniciar o programa (na +/- buffers/cachelinha). Essa diferença é quanto nova memória seu programa recém-iniciado usado.

apenwarr
fonte
2
"Verifique os resultados antes e depois de iniciar o programa", use alternativamente USS (tamanho do conjunto exclusivo) conforme retornado por smem.
Hubert Kario
Portanto, existe uma ferramenta que fornece a quantidade real de memória usada, ferramentas que não são de terceiros.
precisa saber é o seguinte
@CMCDragonkai Sim, grátis.
Deviantfan
1
Se eu iniciar um processo java via java -Xmx16g RunLong, que reservaria 16 Gb de memória para o processo java, na VIRTparte superior, parece que os 16 Gb são contados. Nesse caso, qual é o tipo dessa memória de 16 GB, é a memória mapeada ou ..?
Eric Wang
1
@ EricWang, essa memória não está mapeada. É apenas uma solicitação ao SO para reservar memória que pode ser necessária mais tarde (talvez nunca). (Pelo menos) no Linux, esta é uma chamada mmap com os sinalizadores MAP_NORESERVE e PROT_NONE (consulte os :: pd_reserve_memory chama anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); nenhuma memória é realmente alocada por padrão - isso é feito apenas mais tarde no momento em que o programa realmente precisa da memória para satisfazer as solicitações de alocação de objetos.
Juraj Martinka
23

Na página do manual (1) superior:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Onde RES significa memória RESident (memória física usada).

Na verdade, isso não está correto (mais). Quando diz "swap", também inclui arquivos mapeados pelo programa em seu espaço de endereço, que podem ou não estar realmente consumindo RAM real ainda. Essa memória é suportada por arquivos, mas não é realmente trocada.

O VIRT também inclui páginas que foram alocadas, mas ainda não utilizadas para nada. Qualquer página nesse estado é mapeada para a página zero do kernel (conceito brilhante - você deve procurá-la), para que apareça no VIRT, mas na verdade não consuma memória.

anfetamaquina
fonte
2
bem, isso é interessante, assim como VIRT = SWAP + RES, por que meu uso de SWAP é zero, enquanto a memória virtual para os 2 processos java está perto de 1 GB?
kapso
basicamente Top mostra .... Swap: total de 1048568k, 0k usado, 1048568k livre, 505728k em cache
kapso
15
@ user42159 Esta resposta está errada! Não há 'VIRT = SWAP + RES' no topo do homem! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. É uma pena que eu não possa negar essa resposta.
duleshi
3
Esta resposta está incorreta. USADO = Res + Tamanho da Troca (no topo da Gestão de Campos, acessado pressionando a tecla f quando estiver no topo. Também na página principal).
Jason S
15

Achei essa explicação de Mugurel Sumanariu muito clara:

VIRTsignifica o tamanho virtual de um processo, que é a soma de memória que está realmente usando, memória que foi mapeada para si mesma (por exemplo, a RAM da placa de vídeo para o servidor X), arquivos no disco que foram mapeados nele (a maioria principalmente bibliotecas compartilhadas) e memória compartilhada com outros processos. VIRT representa quanta memória o programa pode acessar no momento presente.

RESsignifica o tamanho do residente, que é uma representação precisa da quantidade de memória física real que um processo está consumindo. (Isso também corresponde diretamente à coluna% MEM.) Isso quase sempre será menor que o tamanho do VIRT, pois a maioria dos programas depende da biblioteca C.

SHRindica quanto do tamanho do VIRT é realmente compartilhável (memória ou bibliotecas). No caso de bibliotecas, isso não significa necessariamente que a biblioteca inteira seja residente. Por exemplo, se um programa usa apenas algumas funções em uma biblioteca, toda a biblioteca é mapeada e será contada no VIRT e SHR, mas apenas as partes do arquivo da biblioteca que contém as funções usadas serão realmente carregadas e contadas sob RES.

Franck Dernoncourt
fonte
Talvez eu apenas reformulasse novamente "VIRT representa quanta memória o programa é capaz de acessar no momento presente". para algo como "VIRT representa o tamanho de todo o espaço endereçável do programa no momento presente". OK, isso ainda pode usar polimento. Mas a questão é: "quanta memória" ainda pode dar a impressão de que estamos discutindo a RAM, quando o VIRT não tem nada a ver com o espaço da RAM. De fato, programas grandes geralmente têm um tamanho de VIRT que é MÚLTIPLO do tamanho total da RAM do sistema - porque esse VIRT é quase inteiramente regiões de endereço com backup de arquivo (AKA "disco não RAM").
FeRD 22/03
5

A coluna VIRT na saída ps / top é quase irrelevante para medir o uso da memória. Não se preocupe com isso. Apache carga pesada VIRT vs memória RES

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

leonbloy
fonte
Obrigado, fiquei preocupado e confuso, porque enquanto o uso de swap era 0%, a coluna de memória virtual é muito alta. E também tenho apenas 1,7 GB do total de memória física de 2,7 GB usada, enquanto a memória virtual é alta?
kapso
2

O Linux suporta memória virtual, ou seja, usar um disco como uma extensão da RAM, para que o tamanho efetivo da memória utilizável aumente de maneira correspondente. O kernel gravará o conteúdo de um bloco de memória atualmente não utilizado no disco rígido, para que a memória possa ser usada para outro propósito. Quando o conteúdo original é necessário novamente, eles são lidos novamente na memória. Tudo isso é completamente transparente para o usuário; os programas em execução no Linux veem apenas a maior quantidade de memória disponível e não percebem que partes deles residem no disco periodicamente. Obviamente, ler e gravar o disco rígido é mais lento (da ordem de mil vezes mais lento) do que usar memória real, para que os programas não sejam executados tão rápido. A parte do disco rígido usada como memória virtual é chamada de espaço de troca.

O Linux pode usar um arquivo normal no sistema de arquivos ou uma partição separada para espaço de troca. Uma partição de troca é mais rápida, mas é mais fácil alterar o tamanho de um arquivo de troca (não é necessário reparticionar todo o disco rígido e, possivelmente, instalar tudo do zero). Quando você sabe quanto espaço de troca você precisa, você deve optar por uma partição de troca, mas se não tiver certeza, poderá usar um arquivo de troca primeiro, usar o sistema por um tempo para ter uma ideia de quanto troca você troca. necessário e, em seguida, faça uma partição de swap quando tiver certeza do tamanho.

Você também deve saber que o Linux permite usar várias partições de troca e / ou arquivos de troca ao mesmo tempo. Isso significa que, se você precisar ocasionalmente de uma quantidade incomum de espaço de troca, poderá configurar um arquivo de troca extra nesses momentos, em vez de manter toda a quantidade alocada o tempo todo.

Uma observação sobre a terminologia do sistema operacional: a ciência da computação geralmente distingue entre trocar (escrever todo o processo para trocar espaço) e paginar (escrever apenas partes de tamanho fixo, geralmente alguns kilobytes por vez). A paginação geralmente é mais eficiente, e é isso que o Linux faz, mas a terminologia tradicional do Linux fala sobre a troca de qualquer maneira.

Fonte: http://www.faqs.org/docs/linux_admin/x1752.html

user42198
fonte
1
Esta resposta espalha o equívoco de que memória virtual é igual a troca ou paginação. O uso do disco como uma extensão da RAM antecede a memória virtual. E existem muitos sistemas (como a maioria dos roteadores SoHo) que possuem memória virtual, mas não usam o disco como uma extensão da RAM. (E esta não é a resposta à pergunta do OP, dado que ele não está usando qualquer swap.)
David Schwartz
2

VIRtualcoluna da parte superior, refere-se ao superespaço (espaço de super consumo) do processo, que o processo pode não estar realmente ocupando no tempo de execução. Há outra coluna RESident, que se refere à memória / espaço físico real alocado pelo processo, no tempo de execução.

A razão da diferença, entre as duas, pode ser entendida pelo exemplo: se o processo estiver usando determinada biblioteca, o tamanho da biblioteca também ajudará a virtual-size. no entanto, como apenas uma parte da biblioteca seria usada (ou seja, alguns métodos em uso), isso ajudará resident-size.

Consulte para mais informações

parasita
fonte
0

"VIRT" apenas endereça o espaço, RES é a memória "real", mas a quantidade "SHR" (= compartilhada) de "RES" é a parte do RES compartilhada com outros processos. Portanto, para a maioria dos processos, acredito que subtrair o SHR do RES fornece a quantidade de memória que é realmente atribuível a esse processo específico.

Máx.
fonte