Bem, vamos analisar alguns problemas de imagem maiores antes de entrar nos detalhes de configuração do JRun.
Se você está recebendo exceções java.lang.OutOfMemoryError no log de erros do JRun, bem, você está sem memória. Não há upvote para isso, por favor ;-). Você não disse se estava executando o Windows de 32 ou 64 bits, mas disse que tem 8 GB de RAM, o que terá algum impacto em uma resposta. Se você está ou não executando uma JVM de 32 ou 64 bits (e qual versão) também afetará as coisas. Então, essas são algumas respostas que nos ajudarão a chegar ao fundo disso.
Independentemente disso, seu aplicativo está ficando sem memória. Está ficando sem memória por um ou mais desses motivos:
- Seu aplicativo está com vazamento de memória. Alguns objetos usados pelo seu aplicativo são continuamente referenciados e, portanto, nunca qualificados para coleta de lixo; ou pior, algum objeto criado novo em cada solicitação é referenciado por outro objeto em perpetuidade e, portanto, nunca é elegível para coleta de lixo. A manipulação correta de sessões do J2EE pode ser particularmente complicada a esse respeito.
- A quantidade de memória necessária para manipular cada solicitação simultânea (no nível de solicitação simultânea configurado) excede a quantidade de memória disponível no heap da JVM. Por exemplo, você tem um tamanho de heap de 1 GB e cada solicitação pode usar até 10 MB. Seu servidor de aplicativos é ajustado para permitir 150 solicitações simultâneas. (Números simplistas, eu sei). Nesse caso, você definitivamente ficaria sem memória se tivesse 100 ou mais solicitações simultâneas sob carga (se cada solicitação utilizasse a quantidade máxima de memória necessária para atender à solicitação).
Outras coisas a serem lembradas: no Windows de 32 bits, uma JVM de 32 bits só pode alocar aproximadamente 1,4 GB de memória. Não me lembro de tudo, se uma JVM de 32 bits no Windows de 64 bits tiver uma limitação menor que o máximo teórico de 4 GB para qualquer processo de 32 bits.
ATUALIZADO
Eu li a postagem do blog vinculada via TalkingTree e a outra postagem vinculada a esse post também. Não corri para este caso exato, mas tive a seguinte observação: o registro de métricas do JRUN pode não registrar os "valores máximos" citados em um período de pico de uso do encadeamento. Acho que registra as métricas em um intervalo fixo e recorrente. Isso é bom para mostrar as características de desempenho médio do aplicativo, mas pode não capturar o estado do JRUN antes que a condição de erro comece a ocorrer.
Sem saber sobre o funcionamento interno do gerenciamento de threads do JRUN, eu ainda digo que ele realmente está sem memória. Talvez ele não esteja sem memória porque seu aplicativo precisou alocar memória no heap da JVM e nenhum estava disponível, mas está sem memória porque o JRUN tentou criar outro encadeamento para manipular uma solicitação recebida e a memória heap necessária para suportar outro encadeamento. t disponível - em outras palavras, os threads não são gratuitos - eles também exigem memória heap.
Suas opções parecem ser as seguintes:
- Reduza a quantidade de memória que seu aplicativo usa em cada solicitação ou -
- Reduza experimentalmente o valor dos parâmetros de ajuste de encadeamento na configuração do JRUN para tornar mais encadeamentos na fila para processamento em vez de se tornarem executáveis ao mesmo tempo, ou -
- Reduza o número de solicitações simultâneas no administrador do ColdFusion (página Solicitação de ajuste, campo "Número máximo de solicitações simultâneas de modelos")