Estou executando top
para 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)
linux
virtualization
memory
top
kapso
fonte
fonte
Respostas:
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
free
comando e verifique os resultados antes e depois de iniciar o programa (na+/- buffers/cache
linha). Essa diferença é quanto nova memória seu programa recém-iniciado usado.fonte
smem
.java -Xmx16g RunLong
, que reservaria 16 Gb de memória para o processo java, naVIRT
parte 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 ..?Na página do manual (1) superior:
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.
fonte
-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.Achei essa explicação de Mugurel Sumanariu muito clara:
fonte
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
fonte
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
fonte
VIRtual
coluna 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 colunaRESident
, 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
fonte
"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.
fonte