Estimando o tamanho máximo de heap da JVM segura em Java de 64 bits

No curso de criação de perfil de um aplicativo Java de 64 bits que está tendo alguns problemas, percebo que o profiler em si (YourKit) está usando quantidades realmente colossais de memória. O que eu tenho no script de lançamento do YourKit é:

<code>JAVA_HEAP_LIMIT="-Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m"
</code>

Ingenuamente, assumindo alguma sobrecarga, isso me levaria a supor que o YourKit vai usar um máximo de algo, talvez um pouco mais de quatro GB. No entanto, o que eu realmente vejo no PS é:

<code>USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dmoles   31379  4.4 68.2 14440032 8321396 ?    Sl   11:47  10:42 java -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dyjp.probe.table.length.limit=20000 -Xbootclasspath/a:/home/dmoles/Applications/yjp-9.5.6/bin/../lib/tools.jar -jar /home/dmoles/Applications/yjp-9.5.6/bin/../lib/yjp.jar
</code>

Esse é um tamanho virtual de quase 14 GB e um tamanho de residência de quase 8 GB - quase três vezes o heap Java.

Agora, eu tenho memória suficiente na minha caixa dev para executar isso, mas voltando para o problema de memória original que estou tentando diagnosticar: Como eu sei com o heap Java que eu tenho que jogar?

Obviamente, se o cliente tiver, digamos, 16 GB de RAM física, não é uma boa ideia dizer-lhes para definir-Xmx para 16 GB.

E daíé um número razoável? 12 GB? 8 GB?

E como eu estimo isso?

questionAnswers(1)

yourAnswerToTheQuestion