JVM Heapsize no sistema operacional de 32 bits

Eu estou usando 32 bits win.7 e usando o Eclipse. Também tendo 4GB de RAM.

Eu quero alocar meu aplicativo java um heapsize máximo de cerca de 3 GB, mas eu sou capaz de alocar máximo de 1,5 GB através de argumentos VM -Xmx1056m .

O que devo fazer? Se eu instalar um win.7 de 64 bits. seria capaz de alocar 3GB heapsize ao meu aplicativo?

Um processo normal do Windows de 32 bits pode endereçar apenas 2 GB de memory, mesmo que você tenha mais memory disponível. Você pode encontrar os limites de memory para diferentes versões do Windows aqui .

Como a VM precisa de memory para mais coisas do que apenas o heap, o tamanho máximo do heap será um pouco menor que a memory máxima disponível para o processo. Normalmente, você pode ajustar o heap até cerca de 1,6 GB para uma VM do Windows de 32 bits.

Você precisa de um sistema operacional de 64 bits e uma máquina virtual de 64 bits para alocar essa quantidade de memory RAM.

Eu não tenho o link agora que descreve o processo de gerenciamento de memory da JVM. A limitação que você tropeçou é uma limitação de como o Java executa a garbage collection. O heap de memory Java deve ser um bloco contencioso. Os algoritmos de garbage collection foram otimizados para essa limitação de design para que possam executar com eficiência. Em um sistema operacional de 32 bits, você não está no controle de quais drivers de dispositivo de endereços de memory são carregados. No Windows, o SO só realocará o endereço base do driver de dispositivo armazenado na DLL se entrar em conflito com um código já carregado. Outros sistemas operacionais podem realocar todos os drivers de dispositivos no carregamento, de modo que eles vivam em um bloco contíguo próximo ao kernel.

Basicamente, a limitação é a mesma para sistemas operacionais de 64 bits e 32 bits. É apenas em um sistema operacional de 64 bits, existem vários intervalos de endereços para escolher. Certifique-se de usar uma JVM de 64 bits para corresponder ao sistema operacional. É por isso que o sistema operacional de 64 bits é capaz de encontrar um maior bloco contigente de endereços de memory do que o sistema operacional de 32 bits.

EDIT: Além disso, a JVM de 32 bits tem um limite de tamanho de heap máximo de 2 GB.

REFERÊNCIA:

http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=/com.ibm.java.doc.igaa/_1vg00014884d287-11c3fb28dae-7ff6_1001.html

Memória máxima de Java no Windows XP

http://forums.sun.com/thread.jspa?messageID=2715152#2715152

O que você precisa não é apenas um sistema operacional de 64 bits e uma VM de 64 bits, mas também mais memory.

Em um sistema Windows de 32 bits, o espaço de endereço virtual é dividido em 2 GB para operações do kernel e 2 GB para aplicativos do usuário. Então você está ferrado.

Existe uma solução possível, mas muito improvável: você pode habilitar a opção / 3GB para aumentar essa limitação e fazer o sistema alocar 1GB de espaço de endereço virtual para operações de kernel e 3GB para aplicativos de usuário (se forem / LARGEADDRESSPACEAWARE ).

Infelizmente, a JVM Sun / Oracle HotSpot de 32bits não é LARGEADDRESSAWARE (que eu saiba), e outras JVM de 32bits provavelmente não são.

Mas pense nisso: mesmo se você fosse capaz de fazer isso, você usaria toda a memory disponível para o seu sistema. Nada seria deixado para outros programas depois de você ter alocado seus 3 GB de heap para sua JVM. Seu sistema estaria trocando para o disco o tempo todo. Seria inutilizável.

Basta obter um SO 64bis com mais RAM. Isso é tudo o que há para você, além de encontrar maneiras de fazer com que seu programa use menos memory.