alocação de memória java no linux

2

Estou executando 4 processos java com o seguinte comando:

java -Xmx256m -jar ...

e o sistema tem 8Gb de memória no fedora 12.

no entanto, aparentemente está entrando em swap.

como pode ser isso se 4 x 256m = 1Gb?

EDIT: também, como todos os 8Gb de memória podem ser usados com tão pouca memória alocada para basicamente a única coisa que roda?

é o java não coleta de lixo porque o SO informa que não precisa ou o quê?

TOP:

top - 20:13:57 up  3:55,  6 users,  load average: 1.99, 2.54, 2.67
Tasks: 251 total,   6 running, 245 sleeping,   0 stopped,   0 zombie
Cpu(s): 50.1%us,  2.9%sy,  0.0%ni, 45.1%id,  1.1%wa,  0.0%hi,  0.8%si,  0.0%st
Mem:   8252304k total,  8195552k used,    56752k free,    34356k buffers
Swap: 10354680k total,    74044k used, 10280636k free,  6624148k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1948 xxxxxxxx  20   0 1624m 240m 4020 S 96.8  3.0 164:33.75 java
 1927 xxxxxxxx  20   0  139m  31m  27m R 91.8  0.4  38:34.55 postgres
 1929 xxxxxxxx  20   0 1624m 200m 3984 S 86.2  2.5 183:24.88 java
 1969 xxxxxxxx  20   0 1624m 292m 3984 S 65.6  3.6 154:06.76 java
 1987 xxxxxxxx  20   0  137m  29m  27m R 28.5  0.4  75:49.82 postgres
 1581 root      20   0  159m  18m 4712 S 22.5  0.2  52:42.54 Xorg
 2411 xxxxxxxx  20   0  309m 9748 4544 S 20.9  0.1  45:05.08 gnome-system-mo
 1947 xxxxxxxx  20   0  137m  28m  27m S 13.3  0.4  44:46.04 postgres
 1772 xxxxxxxx  20   0  135m  25m  25m S  4.0  0.3   1:09.14 postgres
 1966 xxxxxxxx  20   0  137m  29m  27m S  3.0  0.4  64:27.09 postgres
 1773 xxxxxxxx  20   0  135m  732  624 S  1.0  0.0   0:24.86 postgres
 2464 xxxxxxxx  20   0 15028 1156  744 R  0.7  0.0   0:49.14 top
  344 root      15  -5     0    0    0 S  0.3  0.0   0:02.26 kdmflush
    1 root      20   0  4124  620  524 S  0.0  0.0   0:00.88 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.04 ksoftirqd/0
    
por pstanton 07.01.2010 / 14:58

4 respostas

3

O gerenciador de memória colocará automaticamente as coisas em troca, mesmo que a memória física não esteja cheia com base no que acha melhor. Existe uma razão pela qual você não quer que ela entre no swap? Isso está realmente afetando a execução do programa?

Você precisaria desativar o swap para testar a velocidade com ou sem troca.

Além disso, quando é usado o swap? Constantemente ou depois de ter sido executado por um tempo? Você também precisa levar em conta que o sistema subjacente também precisa de memória. E quaisquer IDEs que você esteja usando e quaisquer outros programas em execução. Então você pode precisar trocar mais do que imagina.

    
por 07.01.2010 / 15:20
2

O consumo geral de memória no seu sistema parece bom. Lembre-se de subtrair o "cache" e o "buffer" da porção "usada" para obter uma quantidade exata de memória livre. A memória cache é usada para armazenar arquivos em cache no caso de acesso futuro. Se o Linux precisar de mais memória, ele simplesmente reduzirá essa quantidade de memória, então, geralmente, você não a considera usada para determinar a utilização da memória. Como há 6 GB no pool de cache, há bastante memória RAM disponível, se necessário.

Os processos individuais também parecem bem. A coluna Res representa o tamanho real da memória permitida, que parece próximo ao tamanho de heap especificado. A coluna virt representa apenas a quantidade de memória RAM que pode ser endereçada pelo processo, mas não necessariamente alocada no ponto.

    
por 09.01.2010 / 11:50
2

how can all 8Gb of memory be used with so little memory allocated to basically the only thing running?

Esta é a forma como o gerenciamento de memória do Linux funciona por design. É uma otimização de desempenho que coloca a memória que, de outra forma, estaria vazia (e, portanto, desperdiçada) para armazenar em cache os dados que, caso contrário, precisariam ser lidos novamente no sistema de arquivos.

Embora isso possa parecer uma maneira desordenada de trabalhar, é mais rápido. O sistema operacional pode recuperar essa memória eficientemente assim que ela puder ser usada melhor.

    
por 19.02.2010 / 22:32
2

Você só usou 70 MB de swap.

O gerenciador de memória do sistema operacional pode colocar as coisas onde for melhor. Se você quiser evitar o uso de espaço de troca, é necessário desativá-lo.

Consulte o link para obter informações sobre swapoff .

    
por 07.01.2010 / 15:15