memória JVM

Prezados,
Alguém sabe me dizer porque só consigo configurar minha JVM para alocar 1G no máximo?

Se eu tentar fazer algo maior que isso:

java -Xmx1024M -jar teste.jar 

Dá erro!
Minha máquina tem 4GB da memória.

Há um tempo atras, eu vi um servidor que tinha 16GB e só conseguia configurar 2 e pouco!

No JBoss também só consigo configurar 1024M. Tem como configurar mais.

Tem como mudar isso pro sistema inteiro? Tipo configurar a JVM pra alocar tanto sem ter que setar quando subir uma aplicação?

Grato!

No Windows e no Linux, em uma JVM de 32 bits, só é possível alocar um pouco mais de 1.3 GB.
Se você estiver em Solaris de 32 bits, acho que é um pouco mais (acho que 3GB no máximo).
É uma limitação que não pode ser superada.

Em uma JVM de 64 bits rodando em uma versão do Windows de 64 bits ou do Linux de 64 bits, você não tem essa limitação bisonha.

Já vui se o hardlimit ou o softlimit de memória do usuário foram atingidos?

[quote=entanglement]No Windows e no Linux, em uma JVM de 32 bits, só é possível alocar um pouco mais de 1.3 GB.
Se você estiver em Solaris de 32 bits, acho que é um pouco mais (acho que 3GB no máximo).
É uma limitação que não pode ser superada.

Em uma JVM de 64 bits rodando em uma versão do Windows de 64 bits ou do Linux de 64 bits, você não tem essa limitação bisonha. [/quote]
isso não devia ser assim, deviamos poder alocar a memoria necessaria e não a recomendada

É uma limitação que não pode ser removida. Mude o sistema operacional para um de 64 bits, e a sua JVM para uma de 64 bits. As coisas são assim em 32 bits; a forma mais simples e correta de você poder acessar toda a memória disponível é exatamente essa.

Nos Estados Unidos (onde o consumidor é que tem razão) eles não vendem uma máquina de 4GB de memória se o sistema operacional que vem junto com ela é de 32 bits, até porque o consumidor vai perguntar "onde é que está o 4º GB que comprei? O Windows só mostra 3GB.).
Quando o sistema operacional instalado é de 32 bits, eles só vendem as máquinas com 3GB no máximo.

Devido a uma limitação do Windows e do Linux, o Java só consegue alocar um bloco contíguo de memória para o heap (que é o que ele precisa) com no máximo 1.3 GB de tamanho. Ele poderia usar um pouquinho mais de memória se ele usasse blocos não-contíguos, mas o algoritmo de coleta de lixo se tornaria tão complexo e lento que não valeria os 0.7GB a mais que poderiam ser endereçados. (OK, é possível para um processo no Windows e no Linux ocupar 3GB em modo 32 bits, mas de maneira muito complexa).

Valeu galera! Vou ver esse negócio de sistemas 64. Derrepente não consigo configurar minha máquina de desenvolvimento já que é 32.
Mas meu servidor é 64. Então vou tentar nele.

Não sei o que é isso!
Poderia explicar? Como eu configuro isso?

Grato!

[quote=leohunther]Valeu galera! Vou ver esse negócio de sistemas 64. Derrepente não consigo configurar minha máquina de desenvolvimento já que é 32.
Mas meu servidor é 64. Então vou tentar nele.

Não sei o que é isso!
Poderia explicar? Como eu configuro isso?

Grato!
[/quote]

Não sei se no Windows tem como limitar recursos por usuários, nos unix-like eu sei que tem. Esses limites são impostos aos usuários para que um processo não tome todo o recurso do sistema e prejudique o funcionamento dele como um todo. Por exemplo, tem um OS que em 32bits os processos não conseguem usar mais do que 1G de ram (hardlimit), se vc quiser dá para limitar para ir no máximo 512 MiB (softlimit).

Mas o entanglement já respondeu o motivo do problema. :smiley:

saca só:

Isso no meu Win XP come todo os 512MB de ram mais os 1.qualquercoisa GB de swap em alguns segundos, sem contar que sem memória eu (ou qualquer outro usuário) não consigo abrir mais nenhum programa. :smiley:
Por isso você precisa ter esses limites no seu sistema.

http://www.delorie.com/djgpp/compile/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  for(;;)
     malloc(sizeof(int));  
  return 0;
}

[quote=leohunther]Valeu galera! Vou ver esse negócio de sistemas 64. Derrepente não consigo configurar minha máquina de desenvolvimento já que é 32.
Mas meu servidor é 64. Então vou tentar nele.

Não sei o que é isso!
Poderia explicar? Como eu configuro isso?

Grato!

[/quote]
Sua aplicação precisa de mais de 1gb para funcionar, ou é somente uma experiência?